【发布时间】:2020-10-17 08:33:42
【问题描述】:
struct Foo {};
struct Bar {};
int Baz(const Foo&) { return 0; }
int Baz(Bar&&) { return 1; }
int main()
{
return Baz({});
}
这个调用有歧义吗? MSVC 选择右值引用重载。 GCC 说这是模棱两可的。 Clang 也选择右值引用,但如果它是 int Baz(std::vector<Bar>&&) 或 Bar 获得一个采用 std::initializer_list 的构造函数,则不再选择。
{} 到 Bar 是标准转换顺序吗?
有人可以解释为什么这适用或不适用:
- 标准转换序列 S1 优于标准 转换序列S2 if
[...]
c) 或者,如果不是这样,S1 和 S2 都绑定到引用参数,而不是引用限定成员函数的隐式对象参数,并且 S1 将右值引用绑定到右值,而 S2 绑定对右值的左值引用
(https://en.cppreference.com/w/cpp/language/overload_resolution)
【问题讨论】:
-
A standard conversion sequence是的,但那是您实际上拥有一种类型并将其转换为另一种类型的时候。但是{}.. 是什么类型?请参阅viable functions 部分。 -
措辞有点缺陷(wg21.link/cwg1536),但我们都知道创建了一个临时对象,并且绑定右值引用比绑定左值引用更好。
标签: c++ language-lawyer