gpt4 book ai didi

c++ - 打印函数的地址...声明?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:31 26 4
gpt4 key购买 nike

考虑以下 MCVE:

#include <iostream>

int main()
{
void foo(int);
std::cout << foo << std::endl;

return 0;
}

在这里,我故意尝试以错误的方式打印指向函数的指针,以便 operator<< overload接受 bool 被选中。

 basic_ostream& operator<<( bool value );

令我困惑的是gcc 7.2clang 5.0产生警告,但编译并链接程序。

同时,Visual Studio 15.5.6 不链接此示例。

就我个人而言,我预计这段代码根本不会链接,尽管用作 foo 的编译器似乎是 ODR-used

谁能解释一下为什么 gccclang 能够链接程序?

最佳答案

这是 ODR 违规。但是根据[basic.def.odr]/10 ,强调我的:

Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program outside of a discarded statement; no diagnostic required. The definition can appear explicitly in the program, it can be found in the standard or a user-defined library, or (when appropriate) it is implicitly defined (see [class.ctor], [class.dtor] and [class.copy]). An inline function or variable shall be defined in every translation unit in which it is odr-used outside of a discarded statement.

而且我们必须记住,编译器可以自由地假设您没有编写表现出未定义行为的代码,或者以他们不需要诊断的方式存在格式错误的代码。因为每个函数都必须有一个不为空的地址,bool 重载只能用 true 调用,因为这是转换必须在 valid 中产生的结果程序

我们可以看到GCC 7.3这样做。它传递 1 作为转换的结果,即使在 -O0 也是如此。

关于c++ - 打印函数的地址...声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48652424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com