我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题。
更不用说下面代码的逻辑不完整(复制构造函数和赋值运算符未删除等,这意味着是一个 SSCCE),让我印象深刻的是我的包装器的复制初始化与临时 lambda 导致编译错误,而直接初始化则没有。
这种行为可以在 GCC 4.7.2 和 Clang 3.2 上观察到,而 ICC 13.0.1 和 VC10 编译这两个版本都没有问题。
#include <iostream>
#include <functional>
using namespace std;
struct A
{
    template<typename F>
    A(F&& f) : _f(forward<F>(f)) { }
    ~A() { _f(); }
private:
    std::function<void()> _f;
};
int main()
{
    // A a = [] () { cout << "Hello" << endl; }; // ERROR!
    A a([] () { cout << "Hello" << endl; }); // OK
}
谁是对的,错的有什么问题?这是 C++ 标准库的实现问题,还是编译器问题?
特别欢迎对 C++11 标准的引用。
编辑:
这是 Clang 3.2 产生的错误:
Compilation finished with errors:
In file included from source.cpp:2:
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/functional:1925:2: error: type 'A' does not provide a call operator
    (*_Base::_M_get_pointer(__functor))(
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/functional:2297:33: note: in instantiation of member function 'std::_Function_handler<void (), A>::_M_invoke' requested here
    _M_invoker = &_My_handler::_M_invoke;
                                   ^
source.cpp:9:16: note: in instantiation of function template specialization 'std::function<void ()>::function<A>' requested here
    A(F&& f) : _f(forward<F>(f)) { }
               ^
source.cpp:20:7: note: in instantiation of function template specialization 'A::A<A>' requested here
    A a = [] () { cout << "Hello" << endl; }; // ERROR!
      ^
产生 1 个错误。