【发布时间】:2012-08-26 19:49:06
【问题描述】:
为什么我不能用 auto 初始化一个值并将其传递给一个需要 decltype 作为参数的函数?
让我来设置场景,给你看一个小程序。
这是一个返回值的函数。
int Function(void);
在这种情况下,它恰好是一个整数,但返回类型可能会发生变化。
这就是为什么下一个函数写成如下:
void What_I_Take_Depends_On_Function(decltype(Function()) x);
如果有人决定改变Function的返回类型,那么this函数的减速就不需要改变了。是的,函数的定义可能无法正确处理新类型,或者如果函数的返回类型更改为 void 会有问题,但这与我的问题无关。
#include <iostream>
#include <cstdlib>
int Function(void){return 5;}
void What_I_Take_Depends_On_Function(decltype(Function()) x){return;}
int main(){
//assignments(Edit: these are initializations)
int var1 = Function();
auto var2 = Function();
//initializations
int var3 {Function()};
auto var4 {Function()};
What_I_Take_Depends_On_Function(var1); //works
What_I_Take_Depends_On_Function(var2); //works
What_I_Take_Depends_On_Function(var3); //works
What_I_Take_Depends_On_Function(var4); //COMPILER ERROR
//cannot convert ‘std::initializer_list<int>’ to ‘int’ for argument ‘1’ to ‘void What_I_Take_Depends_On_Function(int)’
return EXIT_SUCCESS;
}
那么为什么 var4 是 initializer_list 而不是 int?
不能自动推断 Function 将返回一个 int,
然后把减速改成和var3类似的?
【问题讨论】:
-
嗯,因为
{...}是一个初始化列表。auto尝试匹配你给它的东西,你给它一个初始化列表。也许你的意思是auto var4 (Function())? (括号,而不是大括号。) -
@RaymondChen 我不明白如何给它一个初始化列表必然会推导出一个初始化列表。
-
因为这就是标准 7.1.6.4(2) 所说的发生。 "从
T获取P,方法是将出现的auto替换为新发明的类型模板参数U,或者如果初始值设定项是braced-init-list(8.5.4),则使用@987654332 @" -
顺便说一句,您在
var1和var2之前的评论是错误的。它们可能看起来像赋值,但它们实际上是初始化 (8.5(1))。 -
@RaymondChen 但你说得好像他应该事先知道。匹配一个初始化列表并不一定意味着它必须是 initializer_list。也可以是
vector<int>。
标签: c++ c++11 auto initializer-list