C++ 使用构造函数的类内成员初始值设定项:允许吗?

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

我最近在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-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
    };