もう一つのC++の質問ですが、オブジェクトを構築するときに "="を使用する効果は何ですか?検討してください:"="を使用したオブジェクト構築の効果
class Foo {
private:
int bar;
int baz;
public:
Foo(int bar, int baz)
:bar(bar), baz(baz) {}
};
int main() {
Foo foo1{4, 2};
Foo foo2 = {4, 2};
Foo foo3 = Foo{4, 2}; // I prefer this one for aesthetic reasons.
return 0;
}
ベストプラクティスとはどのような違いがありますか。
また、私たちはベストプラクティスについて話していますが、暗黙的な変換を伴う奇妙な動作のために、コンストラクタにexplicit
を追加するのがGood Idea™だと聞きました。なぜそれが
error: chosen constructor is explicit in copy-initialization
です:
Foo foo2 = {4, 2};
がエラーでコンパイルに失敗:この、突然
public:
explicit Foo(int bar, int baz)
:bar(bar), baz(baz) {}
:だから私はFoo
のコンストラクタにexplicit
を追加しましたか?
2つの相違点:1)コピー初期化は明示的なコンストラクタでは機能しません。 2) 'auto'はコピーと直接初期化の間で' std :: initializer_list'を異なる方法で引きます。残りの部分については、C++ではそれが問題になります。 – ildjarn
'Foo foo3 = Foo {4,2}; //私はこの方が好きです。なぜ私は分かりません。概念的には、完全に無意味な余分なコピーが含まれていますが、現実的には最適化コンパイラが間違いを元に戻します。しかし、それは冗長で醜いだけです。それは冗長なときに、なぜあなたがしなければならない以上のことを書いていますか?'Foo foo {4,2};は優れています。 –
"コンストラクタに明示的に追加すると聞きました..." - 恐ろしく包括的であることに加えて、言及されたどこにでも言及しなかった作者は、なぜ*これが良いアイデアだと思ったのですか?あなたは同意した、同意しなかった、または単にその正当性を理解していませんか?最後に、[この明示的な説明](http://en.cppreference.com/w/cpp/language/explicit)は検討する価値があります。 – WhozCraig