2

Недавно я нашел интересный кусок кода в статье 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)

Я прав, и в этой статье есть ошибка?

ответ

4

Я прав, и в этой статье есть ошибка?

Да, это ошибка в статье.

В объявлении элемента данных допускается только скользящий или равный-инициализатор. Инициализация d, p и y являются правильными, но не s. Обоснованием для этого является то, что использование списка выражений может привести к двусмысленности объявления с объявлением функции, а также вызвать конфликты с поиском имен в классе.

+0

Спасибо. Не могли бы вы предоставить ссылку на стандарт? Я думаю, что вы указали истинное обоснование такого поведения. – Constructor

+0

@Constructor Стандарт явно не дает обоснования. Правило просто найдено в [class.mem]/p4. Кроме того, http://stackoverflow.com/a/24837330/701092 – 0x499602D2

+0

Вы имеете в виду [класс.mem]/p5? И большое спасибо за эту ссылку! Это очень хорошо. – Constructor

1

An example from Bjarne Stroustrup:

class A { 
    public: 
     A() {} 
     A(int a_val) : a(a_val) {} 
     A(D d) : b(g(d)) {} 
     int a = 7; 
     int b = 5; 
    private: 
     HashingFunction hash_algorithm{"MD5"}; // Cryptographic hash to be applied to all A instances 
     std::string s{"Constructor run"};  // String indicating state in object lifecycle 
    }; 
+0

Благодарим вас за ссылку. – Constructor

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