根据与c++0x相关的N2628,非静态数据成员初始化程序可以被显式定义的构造函数覆盖,但对于隐式定义的复制构造函数似乎有点模糊。
特别是,我注意到在 Apple clang 3.0 版中,行为会根据结构(或类)是否为 POD 而有所不同。
以下程序返回输出“1”,这表明复制构造函数忽略右侧,而是替换新的非静态数据成员初始值设定项(在本例中,X::a 的布尔真值)。
#include <iostream>
#include <string>
struct X
{
std::string string1;
bool a = true;
};
int main(int argc, char *argv[])
{
X x;
x.a = false;
X y(x);
std::cout << y.a << std::endl;
}
但是,令人困惑的是,如果您注释掉 string1:
// std::string string1;
然后行为按我的预期工作(输出为“0”),大概是因为没有隐式生成的复制构造函数,因此数据被复制。
C++0x 规范是否真的建议允许隐式定义的复制构造函数不复制右侧的内容是个好主意?这不是不太有用和不直观吗?我发现非静态成员初始化器功能非常方便,但如果这是正确的行为,那么我将明确避免该功能,因为它的行为棘手且不直观。
请告诉我我错了吗?
更新:此错误已在 Clang 源存储库中修复。请参阅此修订版。
更新:这个错误出现在 Apple clang 3.1 版(tags/Apple/clang-318.0.45)(基于 LLVM 3.1svn)中。这个版本的 clang 作为 Xcode 4.3 for Lion 的一部分分发。