带有已删除的移动构造函数的不明确重载
ambiguous overload with deleted move constructor
如果BREAK定义。
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(如果我用private: Test(T&&);
替换Test(T&&) = delete;
)接受该代码。
我看不出应该在哪里模棱两可。
这是g++问题吗?(我不知道在gcc错误列表中搜索什么…)
已删除的构造函数参与重载解析(是否总是声明特殊的成员函数?);这是必要的,这样就可以使用删除的构造函数来防止转换(摘自8.4.3p3):
struct onlydouble {
onlydouble(std::intmax_t) = delete;
onlydouble(double);
};
在重载解析(8.4.3p2)之后,函数删除的执行在编译过程中非常晚,因此重载解析无法在删除的基础上区分构造函数。gcc是正确的,clang和VC11是不正确的。
注意,模糊性在函数调用表达式func(x)
中,其中自变量x
是类型int
的左值,idfunc
表示具有const Test<int> &
和const Test<double> &
的第一(唯一)参数中的参数类型的重载集;那么可用的转换序列是:
int
左值;int &
;CCD_ 11暂时性;CCD_ 12int
左值;CCD_ 14值;CCD_ 15值;double &&
;Test<double>
暂时性;CCD_ 18
这两个序列是用户定义的等秩转换序列,因此不明确。构造函数Test<double>::Test(double &&)
被删除的事实在这个阶段是无关紧要的。
GCC中存在打开的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54425.
CLANG是正确的,GCC需要解决这个问题。
相关文章:
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++ - 空模板类构造函数不初始化值
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 为什么继承的受保护构造函数不能公开?
- 为什么原始卷曲构造函数 {} 不返回右值?
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 子类化 STL 容器:范围构造函数不起作用
- 带有此指针的模板类多重继承构造函数不起作用?
- C++默认复制构造函数不可行
- 构造函数不会将使用 new 初始化的数组作为参数
- 按值将对象传递给 SubClass 构造函数,导致超类的构造函数不调用
- 为什么 std::map 的移动构造函数不是 noexcept?
- 使用 "()" 调用构造函数不同于"{}"
- 构造函数不明确
- C++:构造函数不明确
- 初始值设定项列表构造函数导致右值构造函数不明确