【发布时间】:2013-09-02 09:33:03
【问题描述】:
我一直在使用 -std=c++1y 的 g++ 支持的返回类型推导。
如果您使用显式返回类型对函数进行原型设计,然后尝试使用返回类型推导来定义该函数,编译器会抱怨一个模棱两可的旧声明:
std::string some_function();
...
auto some_function(){ return std::string{"FOO"}; } //fails to compile
这不起作用有充分的理由吗?
我在定义中使用返回类型推导的理由是保持代码干净,但出于自我记录的原因,希望在原型中使用显式类型。关于何时以及何时不使用返回类型扣除的最佳实践建议将不胜感激:)
为了更清楚,我想回答:
1.这是编译器的实现错误吗? (我很确定不是)
2、这种扣款可以做,但提案标准不允许吗?如果是这样,为什么不呢?
3. 如果这真的是模棱两可的,有哪些例子可以推断出类型并尝试将其与显式前向声明相匹配会给您带来麻烦?
4. 这背后是否存在更深层次的具体实施问题?
5. 仅仅是疏忽吗?
【问题讨论】:
-
何时使用,见my previous question。
-
我在proposal:
auto f(); // return type is unknown auto f() { return 42; } // return type is int auto f(); // redeclaration int f(); // error, declares a different function中找到了这个。让我检查一下 N3690。 -
啊,N3690和错误一样,不能用auto f()重载。我找不到它在哪里说的,但是您正在重载它而不是定义它。
-
不是一个真正的答案,但我最好在声明和定义中以相同的方式拼写签名(确保它们保持不变),并在没有转发的情况下保持 auto声明。
-
@user1233963 是的,返回类型推导有效,但是如果您添加具有显式返回类型的前向声明,它会抱怨它是模棱两可的!这就是我的问题所在。
标签: c++ forward-declaration return-type c++14