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.3forLionの一部として配布されました。