在常规初始化中意外转换

nos*_*sid 4 c++ clang c++11

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>();
}
Run Code Online (Sandbox Code Playgroud)

如果我编译代码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.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么Clang试图进行转换.这听起来像个bug.不幸的是,我在更复杂的代码库中遇到了问题,解决方案并不像删除大括号那么容易.

为什么Clang在这种情况下需要转换?我怎么能让它一般工作?

And*_*owl 5

这绝对是个错误.由于您有默认初始化,因此没有理由尝试调用移动构造函数:

foo b{}; // Same as "foo b;" in any case
Run Code Online (Sandbox Code Playgroud)

如果涉及复制初始化,情况会有所不同,但事实并非如此.

此外,您的代码在GCC 4.7.2上编译良好.