正如预期的那样,C++ 11中的以下内容失败,因为该语言没有bog标准函数的返回类型推导:
auto main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,C++ 14确实如此,所以我无法解释以下错误(在GCC trunk,clang 3.8和Visual Studio 2015中具有相同的结果):
error: 'main' must return 'int'
Run Code Online (Sandbox Code Playgroud)
我没有看到标准中的一个段落,禁止返回类型扣除main?或者两个编译器都不兼容?
(对于它的价值,我永远不会真的这样做.int main()为了胜利......)
关于main()[3.6.1] ,我能够找到的C++ 14的最后一个草案说:
实现不应预定义主函数.此功能不应过载.它应该具有int类型的返回类型,否则其类型是实现定义的.所有实现都应允许两者
- 返回int和的函数()
- 返回int的函数(int,指向char的指针)
及(第5段)
如果控制到达main的末尾而没有遇到return语句,则效果就是执行
return 0;
这是否意味着以下所有内容都是合法的C++ 14最小程序?如果没有,为什么不呢?
auto main() -> int {}auto main() { return 0; }auto main() {}我有一个函数模板,它取一个std::pair对的类型之一的值.我想使用a std::map作为pair参数的条目来调用此函数.
#include <map>
#include <utility>
template <typename T1, typename T2>
void do_stuff(std::pair<T1, T2> const &pair, T1 const &val) {
// Imagine that this does something important...
}
int main() {
std::map<int, float> foo { { 0, 0.0 } };
do_stuff(*foo.begin(), 0);
}
Run Code Online (Sandbox Code Playgroud)
这无法编译,因为地图条目std::pair<const int, float>的类型是,因此类型推导T1具有冲突类型:const int通过pair参数,并int通过val参数.
test.cc: In function ‘int main()’:
test.cc:12:27: error: no matching function for call to ‘do_stuff(std::pair<const int, float>&, int)’
do_stuff(*foo.begin(), …Run Code Online (Sandbox Code Playgroud)