为什么 g++ 允许我将这个 void 函数视为任何东西
Why is g++ allowing me to treat this void-function as anything but?
为什么下面的编译在GCC 4.8(g++
)中?是不是完全畸形了?
void test(int x)
{
return test(3);
}
int main() {}
- 我正在尝试使用调用
test
的结果,该结果不存在 - 我正在尝试从
test
返回一个值
两者都应该从根本上是不可能的 - 不仅仅是UB,据我所知 - 使用void
返回类型。
我得到的唯一警告是关于x
未使用,甚至没有关于添加非标准隐式返回类型的任何内容。
现场演示
这是
标准允许的(§6.6.3/3)
表达式类型为 void 的return 语句只能在返回类型为 cv void 的函数中使用;表达式在函数返回给调用方之前计算
。
至于为什么GCC允许它 - 当然是因为标准要求它是有效的。构建对标准中规则基本原理的传递闭包,我很确定 GCC 允许这样做,因为它在模板的情况下很有用
template<typename F>
typename std::result_of<F()>::type call(F f) {
return f();
}
int main() {
std::cout << call([]{ return 42; }) << std::endl;
call([]{ std::cout << "I'm just an outputtor!" << std::endl; });
}
如您所见,call
不需要在 return 语句中为void
执行特殊情况。有点类似于允许x.~T()
,即使T
最终成为int
。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++模板函数,用于比较任何无符号整数和有符号整数
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- C++中是否有任何函数等同于python中字典的get函数?
- 用于检查值是否为其任何参数的帮助程序函数
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- VkSurfaceKHR 指针的值在函数调用后更改,无需任何显式赋值
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 不执行任何操作的函数调用C++
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 在调用其析构函数之前,是否有任何实际理由检查某些东西是否可破坏?
- 给定一个 3 x 3 矩阵或任何 n x n 矩阵,为什么我的以下函数找不到对角线差异?
- 接受任何 STL 容器的函数
- C++:单向跳转到函数.任何替代方案
- 从析构函数调用虚拟函数-任何解决方法