Biên dịch mã sau với clang 3.5.0 và gcc 4.9.1 mang lại một lỗi ở câu lệnh cuối cùng.Tại sao braced-init-list hoạt động khác trong một cuộc gọi hàm so với lời gọi hàm tạo?
#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? <<<
}
Tại sao Foo({1, 2})
không sao khi bar({1, 2})
không?
Đặc biệt, thật tuyệt vời khi tìm hiểu về lý do cơ bản.
Tôi đoán là, 'Foo ({1,2})' tạo ra một đối tượng Foo tạm thời và gọi ctor bản sao . – Borgleader
@Borgleader Cảm ơn bạn, điều đó có ý nghĩa! :-) – precarious
Nhận xét của @Borgleader là chính xác - với {1, 2} bạn có thể tạo đối tượng Foo tạm thời, nhưng chỉ khi Foo được mong đợi. Bạn có thể không thực sự vượt qua nhiều tham số để hoạt động với điều đó. –