C++ 使用构造函数的类内成员初始值设定项:允许吗?
我最近在Danny Kalev的文章中发现了一段有趣的代码:C++ 使用构造函数的类内成员初始值设定项:允许吗?,c++,c++11,constructor,initialization,in-class-initialization,C++,C++11,Constructor,Initialization,In Class Initialization,我最近在Danny Kalev的文章中发现了一段有趣的代码: class C { string s("abc"); double d=0; char * p {nullptr}; int y[5] {1,2,3,4}; public: C(); }; 行字符串s(“abc”)对我来说似乎可疑。我认为在类中初始化成员时不允许使用构造函数。 这段代码(简化为类C{strings(“abc”);};`)不使用 (编译器参数是-std=c++11-Wall-Wextra-Werror-pedanti
class C
{
string s("abc");
double d=0;
char * p {nullptr};
int y[5] {1,2,3,4};
public:
C();
};
行字符串s(“abc”)代码>对我来说似乎可疑。我认为在类中初始化成员时不允许使用构造函数。
这段代码(简化为类C{strings(“abc”);
};`)不使用
- (编译器参数是
-std=c++11-Wall-Wextra-Werror-pedantic errors
)
- (编译器参数相同:
-std=c++11-Wall-Wextra-Werror-pedantic errors
)
- (编译器参数为
/EHsc/Wall/wd4514/wd4710/wd4820/WX/Za
)
- (编译器参数由服务预定义:
/EHsc/nologo/W4/c
)
我说的对吗?这篇文章有错误吗
我说的对吗?这篇文章有错误吗
是的,这是文章中的一个错误
在数据成员的声明中只允许使用大括号或等号初始值设定项。d
、p
和y
的初始化是正确的,但不是s
。这样做的基本原理是,使用表达式列表会使声明与函数声明混淆,还会导致与类主体中的名称查找冲突。
非常感谢。你能提供标准的参考资料吗?我认为你指出了这种行为的真正理由,但标准没有明确给出理由。该规则可以在[class.mem]/p4中找到。另外,你是指[class.mem]/p5吗?非常感谢您的推荐!它非常好。@我使用的是最新的草案,n4431。您可能正在使用n3242。哦,是的。准确地说是n3337。谢谢你的推荐。
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
};