【发布时间】:2012-12-04 12:43:14
【问题描述】:
如果 BREAK,g++ 4.6.3 和 4.7.2 无法编译以下代码(在 c++0x 模式下) 已定义。
template<class T> struct Test {
Test(T&) {}
#ifdef BREAK
Test(T&&) = delete;
#endif
};
void func(Test<int> const&) {}
void func(Test<double> const&) {}
int main()
{
int x = 0;
func(x);
return 0;
}
错误是
error: call of overloaded 'func(int&)' is ambiguous
虽然 clang 3.2 RC2 和 VC11(如果我将 Test(T&&) = delete; 替换为 private: Test(T&&);)接受代码。
我看不出哪里有歧义。
这是一个 g++ 问题吗? (不知道在gcc的bug列表中搜索什么...)
【问题讨论】:
-
FWIW,
= deleted 函数不会从重载决议中删除。这仅意味着如果重载决议选择了它们,则程序是不正确的。 -
是的,但它是
func,这是模棱两可的。原始代码中的Test是std::reference_wrapper,deleted 构造函数是为了防止引用临时对象,IIUC。