Kompilowanie następującego kodu z kodem 3.5.0 i gcc 4.9.1 powoduje błąd w ostatniej instrukcji.Dlaczego lista wiersza-inicjalizowanego zachowuje się inaczej w wywołaniu funkcji w porównaniu z wywołaniem konstruktora?
#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? <<<
}
Dlaczego Foo({1, 2})
porządku podczas bar({1, 2})
nie jest?
Szczególnie byłoby wspaniale dowiedzieć się o racjonalności.
Domyślam się, 'Foo ({1,2})' tworzy tymczasowy obiekt Foo i wywołuje konstruktor kopiowania . – Borgleader
@Borgleader Dziękuję, to ma sens! :-) – precarious
Komentarz do @Borgleader jest poprawny - z {1, 2} możesz utworzyć tymczasowy obiekt Foo, ale tylko wtedy, gdy oczekuje się Foo. W rzeczywistości nie można przekazać wielu parametrów, aby z tym działać. –