Bob*_*ane 3 c++ lambda initializer-list stdbind c++11
我试图std::bind去一个lambda时遇到了错误.以下代码示例编译正常:
#include <functional>
#include <iostream>
int main()
{
const auto lambda1 = [](int a, int b){ return a + b; };
std::cout << (std::bind( lambda1, std::placeholders::_1, 2))(2)
<< std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但以下不是:
#include <functional>
#include <iostream>
int main()
{
const auto lambda2 { [](int a, int b){ return a + b; } }; // Note the "{ }-initialization"
std::cout << (std::bind( lambda2, std::placeholders::_1, 2))(2)
<< std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我使用Visual Studio 2013得到的错误输出,更新4:
1>------ Build started: Project: Project1, Configuration: Debug Win32 ------
1> main.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(58): error C2064: term does not evaluate to a function taking 2 arguments
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap(118) : see reference to class template instantiation 'std::_Result_of<_Fty,int &,int &>' being compiled
1> with
1> [
1> _Fty=std::initializer_list<main::<lambda_55c00b1d5f4fcd1ad46b46ad921a2385>>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\functional(975) : see reference to class template instantiation 'std::result_of<_Funx (int &,int &)>' being compiled
1> with
1> [
1> _Funx=std::initializer_list<main::<lambda_55c00b1d5f4fcd1ad46b46ad921a2385>>
1> ]
1> main.cpp(23) : see reference to class template instantiation 'std::_Do_call_ret<false,_Ret,std::initializer_list<main::<lambda_55c00b1d5f4fcd1ad46b46ad921a2385>>,std::tuple<std::_Ph<1>,int>,std::tuple<int &>,std::_Arg_idx<0,1>>' being compiled
1> with
1> [
1> _Ret=void
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?似乎与初始化列表有某种混淆,但我不确定我是什么原因.
在c ++ 17之前,auto foo{x};创建一个类型为的元素的初始化列表x.
const auto lambda2 { [](int a, int b){ return a + b; } };
Run Code Online (Sandbox Code Playgroud)
所以这lambda2不是lambda,它是lambda的初始化列表.
这是在c ++ 17中修复的,可能会追溯应用为缺陷.这非常令人惊讶.
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |