2015-05-31 5 views
6

Я знаю разницу между const и constexpr. Одна из них - это константа времени компиляции, а другая - время компиляции или постоянная времени выполнения.const constexpr char * vs. constexpr char *

Однако, для массива символов/строк, я смущен, почему компилятор жалуется, что один из них используется над другим.

Например, у меня есть:

constexpr char* A[2] = {"....", "....."}; 

const constexpr char* B[2] = {"....", "....."}; 

С декларацией "А" я получаю:

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 

но декларация "B" я не получаю никаких предупреждений.

Почему дополнительный определитель констант избавляется от предупреждения? Разве оба они не «const char *»? Я спрашиваю, потому что оба объявлены с constexpr, которые должны сделать его const char* по умолчанию?

Я бы ожидать, чтобы быть в порядке: S

+3

'constexpr' применяется к указателю, что делает его' const', но не объектом, на который он указывает. Таким образом, это один из нескольких случаев, когда вам может понадобиться комбинировать 'const' и' constexpr'. – 0x499602D2

+3

'constexpr char *' является 'char * const'. Спецификатор 'constexpr' применяется ко всему типу объекта, т. Е. Относится к объявлению,' const' является квалификатором (типа). – dyp

ответ

8

const сообщает компилятору, что символы вы направляете не должны быть записаны в.

constexpr сообщает компилятору, что указатели, которые вы храните в этих массивах, могут быть полностью оценены во время компиляции. Однако он не говорит о том, могут ли появляться символы, указывающие указатели.

Кстати, еще один способ, которым Вы могли бы написать этот код будет выглядеть так:

const char * const B[2]; 

Первого const относится к гольцам, а второй const применяется для самого массива и указателей, которые он содержит.

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