このコードを考えてみましょう:
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
これは印刷します:
vector overload
int overload
あいまいなオーバーロードの解決が原因でコンパイルエラーが発生しないのはなぜですか?2番目のコンストラクターが削除されると、vector overload
2回取得されます。どのように/メトリック何によってであるint
ため、明確に、より良い試合{}
よりはstd::vector<int>
?
コンストラクタのシグネチャは確実にさらにトリミングできますが、同等のコードにだまされて、この質問で重要なものが失われていないことを確認したいと思います。
@Setiこれは
—
Max Langhof
{}
特定の特殊なケースで効果的に機能しますが、一般的には正しくありません(初心者の場合、std::vector<int> x = {};
機能しますが、std::vector <int> x = 0;
そうではありません)。「{}
ゼロを割り当てる」ほど単純ではありません。
そう、それほど単純ではありませんが、それでもゼロを割り当てます-この動作は非常に混乱し、実際には使用すべきではないと思います
—
Seti
@Setiは、
—
Max Langhof
struct A { int x = 5; }; A a = {};
それが構築し、あらゆる意味でゼロを割り当てていないA
とa.x = 5
。これはA a = { 0 };
、a.x
0に初期化するとは異なります。ゼロはに固有ではなく{}
、各タイプがデフォルトで構築または値で初期化される方法に固有です。参照してください。ここで、こことここ。
私はまだデフォルトで作成された値が混乱していると思います(常に動作を確認するか、多くの知識を維持する必要があります)
—
Seti
{}
コードのブロックとして正しく呼び出すと、変数に0が割り当てられます-例:const char x = {}; は0(null char)に設定され、intなどと同じ