【发布时间】:2011-11-21 20:53:00
【问题描述】:
根据与c++0x 相关的N2628,非静态数据成员初始化程序可以被显式定义的构造函数覆盖,但对于隐式定义的复制构造函数似乎有点模糊。
特别是,我注意到在 Apple clang 3.0 版中,行为会根据结构(或类)是否为 POD 而有所不同。
以下程序返回输出“1”,这表明复制构造函数忽略右侧,而是替换新的非静态数据成员初始值设定项(在本例中,X 的布尔真值::一种)。
#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 源代码库中修复。看到这个revision。
更新:此错误在 Apple clang 3.1 版 (tags/Apple/clang-318.0.45) 中已修复(基于 LLVM 3.1svn)。此版本的 clang 作为 Xcode 4.3 for Lion 的一部分分发。
【问题讨论】:
标签: c++0x c++ c++11 clang default-copy-constructor