Compilare il seguente codice con clang 3.5.0 e gcc 4.9.1 restituisce un errore nell'ultima istruzione.Perché la bretella-init-list si comporta diversamente in una chiamata di funzione rispetto a una chiamata del costruttore?
#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? <<<
}
Perché Foo({1, 2})
bene mentre bar({1, 2})
non lo è?
In particolare, sarebbe bello conoscere la logica.
La mia ipotesi è, 'Foo ({1,2})' crea un oggetto Foo temporanea e chiama il ctor copia . – Borgleader
@Borgleader Grazie, ha senso! :-) – precarious
Il commento di @Borgleader è corretto - con {1, 2} puoi creare un oggetto Foo temporaneo, ma solo quando è previsto Foo. In realtà non è possibile passare più parametri per funzionare con quello. –