2017-02-17 9 views
2

В презентации «Изучение C++ 17 и выше» Майка Исааксона в какой-то момент (https://youtu.be/-ctgSbEfRxU?t=2907) возникает вопрос о написании:constexpr в C++ 11 и C++ 14 (не различие к ключевому слову const)

const constexpr .... 

vs single const. Майк сказал, что в C++ 11 constexpr подразумевает const и в C++ 14 это не так. Это правда? Я пытался найти доказательство этого, но не мог.

Я не спрашиваю о различии между const и constexpr (как и многие другие вопросы), но о различии в constexpr в двух версиях стандарта C++.

+4

В C++ 11 constexpr для функций-членов подразумевает константу этой функции-члена. Эта импликация была удалена в C++ 14. – dyp

+0

@ dyp: Я не следую. Константная функция-член будет иметь ключевое слово 'const', которое заканчивает список аргументов, а не предшествует ему, как в этом вопросе (' const constexpr'). Что мне не хватает? – IInspectable

+0

В ответе здесь [Разница между constexpr и const?] (Http://stackoverflow.com/questions/14116003/difference-between-constexpr-and-const) примером является 'constexpr const int * NP = & N;' , и вам нужны оба, потому что они затрагивают разные части декларации. Это не изменилось между языковыми версиями. –

ответ

0

Рассмотрим этот кусок кода:

struct T { 
    int x; 

    constexpr void set(int y) { 
    x = y; 
    } 
}; 

constexpr T t = { 42 }; 

int main() { 
    t.set(0); 
    return 0; 
} 

Он должен компилировать в C++ 14, но дают ошибку в C++ 11, если функция член setconst был объявлен. Это связано с тем, что constexpr подразумевает const в C++ 11, в то время как это не соответствует действительности в последующих версиях стандарта.

Ключевое слово constexpr гарантирует, что объект не будет динамически инициализирован во время выполнения. В случае функций он гарантирует, что функция может быть оценена во время компиляции. В C++ 11 это было смешано с «хранением в постоянной памяти», но вскоре это было признано ошибкой.

В C++ 14, кроме того, constexpr функции и элементы намного более способны. Например, они могут изменять объекты не const, поэтому они не могут быть неявно const.

+1

Почему downvote? – gigabytes

 Смежные вопросы

  • Нет связанных вопросов^_^