Return 初始化列表而不是 std::function 中的向量
Return initializer list instead of vector in std::function
Edit: It is not duplicated of the linked question (which is mine also). Here all the return types are std::vector
. I do not want to
return an initializer-list
. I want to fill the returned
std::vector
by initializer-list
directly
让我们以这四种情况为例:
1)
//Acceptable
std::vector<int> foo(){
return std::vector<int>{1};
}
2)
//Acceptable
std::vector<int> foo(){
return {1};
}
3)
//Acceptable
std::function<std::vector<int>()> foo=[](){
return std::vector<int>{1};
};
4)
//NOT Acceptable
std::function<std::vector<int>()> foo=[](){
return {1};
};
为什么 2 可以接受而 4 不能接受?他们之间有什么不同?而且,最奇怪的是,这是可以接受的:
//Acceptable
auto bar=[]()->std::vector<int>{
return {1};
};
std::function
和 initializer-list
有什么问题?
此版本编译:
std::function<std::vector<int>()> foo=[]()->std::vector<int>{
return {1};
};
这与您的案例 4 相同,除了 lambda 表达式中的显式 return 类型。这表明 std::function<>
声明的类型不会传播到 lambda 表达式的解析中; lambda 独立于周围的表达式进行解析。
我不确定这是 C++ 语言标准的特性还是现实世界编译器的限制(我用 g++ -std=c++11
测试过),因为我不是太语言律师了。
(4) 中 lambda 的 return 类型是 auto
,而不是 (2) 中和您仍在使用的上一个示例中的 std::vector
一个 lambda,但强制使用 return 类型。
在 return {1}
中扣除 auto
导致 std::initializer_list<int>()
,这与 std::function
预期的 std::vector<int>()
不同。
auto bar=[]()->std::vector<int>{
指定 lambda bar
的 return 类型为 std::vector<int>
。
std::function<std::vector<int>()> foo=[](){
没有指定foo
的return类型,因为你先推导出lambda的return类型,然后赋值。
C++ 在决定类型时不考虑您可以将 lambda 分配给什么,它看到 return {1},这是一个 std::initializer_list<int>
,与 std::function<std::vector<int>>
.
Edit: It is not duplicated of the linked question (which is mine also). Here all the return types are
std::vector
. I do not want to return aninitializer-list
. I want to fill the returnedstd::vector
byinitializer-list
directly
让我们以这四种情况为例:
1)
//Acceptable
std::vector<int> foo(){
return std::vector<int>{1};
}
2)
//Acceptable
std::vector<int> foo(){
return {1};
}
3)
//Acceptable
std::function<std::vector<int>()> foo=[](){
return std::vector<int>{1};
};
4)
//NOT Acceptable
std::function<std::vector<int>()> foo=[](){
return {1};
};
为什么 2 可以接受而 4 不能接受?他们之间有什么不同?而且,最奇怪的是,这是可以接受的:
//Acceptable
auto bar=[]()->std::vector<int>{
return {1};
};
std::function
和 initializer-list
有什么问题?
此版本编译:
std::function<std::vector<int>()> foo=[]()->std::vector<int>{
return {1};
};
这与您的案例 4 相同,除了 lambda 表达式中的显式 return 类型。这表明 std::function<>
声明的类型不会传播到 lambda 表达式的解析中; lambda 独立于周围的表达式进行解析。
我不确定这是 C++ 语言标准的特性还是现实世界编译器的限制(我用 g++ -std=c++11
测试过),因为我不是太语言律师了。
(4) 中 lambda 的 return 类型是 auto
,而不是 (2) 中和您仍在使用的上一个示例中的 std::vector
一个 lambda,但强制使用 return 类型。
在 return {1}
中扣除 auto
导致 std::initializer_list<int>()
,这与 std::function
预期的 std::vector<int>()
不同。
auto bar=[]()->std::vector<int>{
指定 lambda bar
的 return 类型为 std::vector<int>
。
std::function<std::vector<int>()> foo=[](){
没有指定foo
的return类型,因为你先推导出lambda的return类型,然后赋值。
C++ 在决定类型时不考虑您可以将 lambda 分配给什么,它看到 return {1},这是一个 std::initializer_list<int>
,与 std::function<std::vector<int>>
.