为什么即使在声明中指定了返回类型,也必须在函数定义中包含返回类型?
Why is it necessary to include the return type in a function definition even if it's specified in the declaration?
当您在单独的cpp文件中定义函数时,如果编译器知道一个方法不能重载另一个具有相同签名但只因返回类型不同的方法,为什么需要返回类型来指示要定义哪个特定函数?foo::bar(params)是否足以指定此项?
头文件
class foo{
public:
void bar();
};
源文件
foo::bar() //equivalent to function declaration? throws error
{...}
感谢
我不认为有任何内在的原因不能做到这一点,但使用它会导致不一致。毕竟,如果函数的定义可见,则不必声明函数,但在这种情况下,必须包含返回类型。因此,前面有声明的函数定义不需要返回类型,但没有的函数定义需要返回类型。如果删除了声明,就必须重写定义。总的来说,到处乱搞太多了。
EDIT:更不用说当您查看函数的定义时,将返回类型放在您面前的方便性了。
似乎C++的设计目标并不是消除程序中所有可能的冗余。
这甚至不是一个好目标,至少如果走到极端的话。
在两个地方重复相同的信息是有用的,如果它们冲突,则标记错误。
一些编程语言在基本控制语法中内置了冗余,如while condition ; do .. if condition ; then .... end if; ... end while;
。while
必须由end while
终止,if
必须由end if
终止。然后编译器就可以准确地知道缺少哪一个。这类语言的支持者坚持认为,这比诊断15个可能的大括号中有一个没有闭合要好。:)
定义中重复的返回类型在另一方面也对程序员有帮助:程序员不必跳到声明中查看返回类型是什么
在某些情况下,删除返回类型实际上需要额外的工作。标头中的声明可以通过精确的复制和粘贴来生成。甚至使用自动化工具。您不希望使用头生成工具从定义中去掉返回类型。
我们首先应该质疑宣言的必要性。函数的定义是主要的工件;声明只是为了一个特定的编译模型而被考虑在内的。换句话说,问题是"既然我们有一个函数定义,为什么我们必须在任何地方重复它的任何部分"。
就这么简单。如果您没有定义返回类型,则不是定义函数。根据定义,函数声明必须具有返回类型。想想前向声明的函数。您总是在正向声明和定义中定义返回类型。为什么?因为如果你不这样做,它就不符合函数的语法。
从逻辑上讲,我认为这是没有必要的。
但是C++从C继承了其声明符语法,其中定义也是声明。声明需要返回类型。
而且,尽管存在明显的不兼容性(例如成员函数),但没有理由故意偏离这一点。
如果要编写一种全新的语言,那么只要定义不是声明,就可以使定义的返回类型是可选的。定义前声明将成为强制性声明;如果你问我的话,有点麻烦!
- 如何获取std::result_of函数的返回类型
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 模板返回类型函数如何在C++中工作
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 在引用或指针返回类型函数上输入
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 我可以在c++中重写字符串返回类型函数吗?