5

次のコードを clang 3.5.0 および gcc 4.9.1 でコンパイルすると、最後のステートメントでエラーが発生します。

#include <iostream>

struct Foo { Foo(int x, int y) { std::cout << "Foo(int = " << x << ", int = " << y << ")" << std::endl; } };

void bar(int x, int y) { std::cout << "bar(int = " << x << ", int = " << y << ")" << std::endl; }

int main()
{
   Foo({}, {});   // Foo(int = 0, int = 0)
   Foo({1}, {2}); // Foo(int = 1, int = 2)
   Foo({1, 2});   // Foo(int = 1, int = 2)

   bar({}, {});   // bar(int = 0, int = 0)
   bar({1}, {2}); // bar(int = 1, int = 2)
   bar({1, 2});   // error: no matching function for call to 'bar'  <<< Why? <<<
}

なぜFoo({1, 2})大丈夫なのに大丈夫でbar({1, 2})はないのですか?

特に、理論的根拠について学ぶことは素晴らしいことです。

4

2 に答える 2

6

Foo({1,2})一時的な Foo オブジェクトを作成し、コピー コンストラクターを呼び出します。

コピー コンストラクターの削除を使用したこの変更例を参照してください: http://coliru.stacked-crooked.com/a/6cb80746a8479799

次のエラーが発生します。

main.cpp:6:5: note: candidate constructor has been explicitly deleted
    Foo(const Foo& f) = delete;
于 2014-11-07T16:59:42.000 に答える
1

この線

bar({1, 2});

実際にbar関数に渡す、タイプの一時オブジェクト

<brace-enclosed initializer list> // it's made clear in the comments that brace initializers have no type

この一時オブジェクトを最初の引数の型に変換する方法はありませんint。したがって、エラー

<brace-enclosed initializer list>int引数1を変換できません

void bar(int, int)
于 2014-11-07T17:02:58.027 に答える