Недавно я нашел интересный кусок кода в статье Get to Know the New C++11 Initialization Forms Дэнни Kalev:Инициализатор члена класса с использованием конструктора: разрешено ли это?
class C
{
string s("abc");
double d=0;
char * p {nullptr};
int y[5] {1,2,3,4};
public:
C();
};
Линия string s("abc");
кажется мне подозрительным. Я думал, что использование конструктора не допускается, когда элемент инициализируется в классе. И этот код (упрощено до class C { string s("abc");
}; `) не компилируется с
- clang 3.6.1 (аргументы компилятора
-std=c++11 -Wall -Wextra -Werror -pedantic-errors
) - g++ 5.1.0 (аргументы компилятора одинаковы:
-std=c++11 -Wall -Wextra -Werror -pedantic-errors
) - vc++ 18.00.21005.1 (аргументы компилятора являются
/EHsc /Wall /wd4514 /wd4710 /wd4820 /WX /Za
) - vc++ 19.00.22929.0 (аргументы компилятора предопределены службой:
/EHsc /nologo /W4 /c
)
Я прав, и в этой статье есть ошибка?
Спасибо. Не могли бы вы предоставить ссылку на стандарт? Я думаю, что вы указали истинное обоснование такого поведения. – Constructor
@Constructor Стандарт явно не дает обоснования. Правило просто найдено в [class.mem]/p4. Кроме того, http://stackoverflow.com/a/24837330/701092 – 0x499602D2
Вы имеете в виду [класс.mem]/p5? И большое спасибо за эту ссылку! Это очень хорошо. – Constructor