Clang 3.2报告以下代码中的错误,我不明白为什么会出现问题。该错误仅在模板函数中发生,并且仅在使用大括号进行初始化时才会发生。其他两个初始化按预期工作。
struct foo {
foo() { }
~foo() = default;
// deleted
foo(const foo& rhs) = delete;
foo(foo&& rhs) noexcept = delete;
auto operator=(const foo& rhs) -> foo& = delete;
auto operator=(foo&& rhs) noexcept -> foo& = delete;
};
template <typename Type>
void bar() {
foo a; // OK
foo b{}; // ERROR
}
int main() {
foo c{}; // OK
bar<int>();
}
如果我使用clang++ -Wall -std=c++11 -c
编译代码,Clang会输出以下错误消息:
bug.cpp:14:9: error: conversion function from 'foo' to 'foo' invokes a deleted function
foo b{}; // ERROR
^
bug.cpp:19:5: note: in instantiation of function template specialization 'bar<int>' requested
here
bar<int>();
^
bug.cpp:6:5: note: function has been explicitly marked deleted here
foo(foo&& rhs) noexcept = delete;
^
1 error generated.
我不知道为什么Clang会尝试进行转换。这听起来像个bug。不幸的是,我在更复杂的代码库中遇到了问题,解决方案并不像删除大括号那么容易。
为什么Clang在这种情况下需要转换?我怎么能让它一般工作?
答案 0 :(得分:5)
这绝对是个错误。没有理由为什么要尝试调用移动构造函数,因为你有一个默认初始化:
foo b{}; // Same as "foo b;" in any case
如果涉及复制初始化,情况会有所不同,但事实并非如此。
此外,您的代码在GCC 4.7.2上编译良好。