ここにC ++コードの一部があります。
この例では、多くのコードブロックがコンストラクター呼び出しのように見えます。残念ながら、ブロックコード#3はそうではありません(https://godbolt.org/z/q3rsxnとhttps://cppinsights.ioを使用して確認できます)。
これは古いC ++表記であり、{}を使用した新しいC ++ 11構成表記の導入を説明できると思います(#4を参照)。
T(i)
意味の説明はありますか?コンストラクタの表記にとても近いですが、間違いなくとても違いますか?
struct T {
T() { }
T(int i) { }
};
int main() {
int i = 42;
{ // #1
T t(i); // new T named t using int ctor
}
{ // #2
T t = T(i); // new T named t using int ctor
}
{ // #3
T(i); // new T named i using default ctor
}
{ // #4
T{i}; // new T using int ctor (unnamed result)
}
{ // #5
T(2); // new T using int ctor (unnamed result)
}
}
注意:したがって、T(i)
(#3)はと同等T i = T()
です。
1
あなたの発言はすべて正しいと思います。
—
Arne J
追加:コンパイラは、あなたがそれを求めるなら、あなたが知っておく必要があるほとんどすべてを教えてくれることに注意
—
Max Langhof
-Wall
して、あなたが得る「warning: parentheses were disambiguated as redundant parentheses around declaration of variable named 'i' [-Wvexing-parse]
」打ち鳴らすから、またはわずかに少ないやる気「warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
」GCCから。
@QuentinUKこのリンクをありがとう。関数(など
—
Pascal H.
T t()
)については知っていましたが、それほど単純な宣言式についてはそうではありませんでした。確かに、これは厄介なことかもしれません。