C++能否在函数内使用局部变量,并且函数的类型从函数返回类型中自动推断?

6
我的问题:假设我正在C++(或C)中定义一个函数。是否有类似于C++的autodecltype的东西,可以在函数定义内部使用,以便声明一个具有从正在定义的函数的返回类型推断出的类型的本地变量?
示例: 在C和C ++中常见的编码模式是
SomeType foo() {
   SomeType x;
   // ... do something to x ...
   return x;
}

我希望能够推断出第二个SomeType而不是明确地输入它。以下内容不可行,但我希望可以以这种方式进行处理。

SomeType foo() {
   decltype(return) x;  //<-- infer the function return type, which here is SomeType
   // ... do something to x ...
   return x;
}

对于简单的返回类型,这并不是什么大问题,但当返回类型比较复杂时(比如返回类型是一个具有许多模板参数的模板类),不必在函数内部重复定义该类型将会更好(也不容易出错)。
我还希望不必更改函数定义以实现此目的。因此,在上面的示例中,虽然可以将 SomeType 更改为宏,或者使 foo 成为模板函数, SomeType 成为模板参数,但我真正想知道的是是否可以从周围函数的返回类型推断出特定的类型。
也许答案是“不可能”,这是公平的,但我想知道这个问题的答案。

2
您可以将返回类型设置为 auto 并在函数内部使用实际类型。 - chris
@chris 这需要 C++14 或类似的东西,对吧? - pqnet
@pqnet,是的,我本来想说的,但显然我没有说出口。 - chris
2
在C++11中,您可以使用decltype(foo())或者返回语句中的大括号初始化来避免返回类型名称的重复。在简单的lambda表达式(只有一个返回语句)中,返回类型也可以被推断出来(我知道的几乎所有C++11编译器都已放宽对带有多个返回语句的lambda表达式的要求)。 - dyp
@dyp 我认为在lambda中,C++11也允许不指定返回类型(它被假定为返回表达式的decltype)。 - pqnet
2
在严格的C++11中,没有尾随返回类型的lambda可以通过返回类型推断来确定它们的返回类型(通过“auto”规则而不是“decltype”规则),但只有当它们仅由单个返回语句组成时才会生效: “[]{ return 42; }” 返回一个'int',“[]{ int x = 42; return x; }”应该无法编译(返回类型为“void”)。但在我所知道的编译器中,只有VS2010使用这些规则。详情请参见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#975 - dyp
1个回答

6
在C++11中:
SomeType foo()
{
    decltype(foo()) x;

foo()表达式的类型与foo函数的返回值类型相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接