におけるPODとの暗黙の型変換の初期化:デフォルトコンストラクタ、私はちょうど彼が次のコードを提示ネイティブ2012を行くのクランにチャンドラーのプレゼンテーションを見ているC++ 11
#include <iostream>
struct S{ int n; };
struct X{ X(int) {}; };
void f(void*)
{
std::cerr << "Pointer!\n";
}
void f(X)
{
std::cerr << "X!\n";
}
int main()
{
f(S().n);
}
チャンドラーが、これはf(void*)
を呼び出すと述べているがC++ 11の場合はf(X)
、C++ 03の場合はf(X)
。 彼はまた、S()。nはデフォルトで0に初期化され、nullptr
という定数になっているという理由も述べています。
最初に、メンバー変数nのゼロ初期化がコンパイラの実装に依存していて、標準によって保証されていないと仮定しています(またはこの変更はC++ 11で行われましたか)。チャンドラーは、これは定数式のサポートによるものだと思っていますが、私はまだ彼の推論に完全に従うことができません。
第2に、f(X)
はなぜC++ 03で呼び出され、C++ 11では呼び出されないのですか?
Clang: Defending C++ from Murphy's Million Monkeys
欠陥報告がこれにまだ提出されているかどうか知っていますか?私は何も見ていないが、私はそれを逃した可能性があります。 – bames53
ありがとう、私は決してチャンドラーのプレゼンテーションを見た後、興味のあるようなコードを書くことはありません... – mark
ああNVM私は今、 "int"とあなたは "int変数"を意味します。私は混乱していて、 "0"はintではない、またはint式は決してnullポインタ定数ではないと言っていると思っていました。 –