打印功能的地址..声明
Printing the address of function... declaration?
考虑以下mcve:
#include <iostream>
int main()
{
void foo(int);
std::cout << foo << std::endl;
return 0;
}
在这里,我故意以错误的方式打印指向函数的指针,以使操作员&lt;&lt;选择接受bool
的超载。
basic_ostream& operator<<( bool value );
困扰我的事情是GCC 7.2和Clang 5.0都会产生警告,但编译和链接
同时, Visual Studio 15.5.6 不链接此示例。
我个人希望,尽管用作foo
的编译器似乎是 odr-使用。
有人可以解释为什么 gcc 和 clang 能够链接程序吗?
这是ODR违规。但是根据[BASIC.DEF.ODR]/10,重点是我的:
每个程序应完全包含每个非内线的一个定义 在该程序之外使用ODR的功能或变量 丢弃的声明;无需诊断。定义可以 明确出现在程序中,可以在标准或 用户定义的库,或(在适当的情况下(隐式定义 (请参阅[class.ctor],[class.dtor]和[class.copy](。内联函数 或应在每个翻译单元中定义变量 在废弃的语句之外使用ODR。
,我们必须记住,编译器可以自由地假设您不编写表现出不确定行为的代码,或者以他们不需要诊断的方式不正确。因为每个函数必须具有一个不是null的地址,所以bool
过载可以使用true
调用,因为这是转换必须在a 有效程序中产生的。
我们可以看到GCC 7.3这样做。它通过1通过1的结果,即使在-O0
。
相关文章:
- 如何在C++中获取该对象的类声明中对象的地址?
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- 如何找到在本地范围内声明的变量的地址?
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 打印功能的地址..声明
- 是否可以使用指向语句中声明的变量地址的指针"if"
- 如果在循环中声明了指针变量,则它是否与循环的每次传递都与相同的内存地址相关联
- 如何声明 IP 地址以将其与多种功能一起使用
- (C++)返回函数内部声明的对象的地址
- 如何在指向常量地址时声明成员函数常量指针
- 可互换声明的变量具有相同的内存地址模式
- 是任何编程语言(C++、C#、Java、C.)中声明函数的最终内存地址,无论是相对地址还是绝对地址
- 变量的地址是不是一个接一个声明,一个接一个
- 为什么数组元素的地址有时会被误认为是声明
- 不能在函数声明中使用地址运算符
- 用内存地址声明函数
- 用C++中现有映射的地址分配新声明的映射的地址可以吗
- 给定64位虚拟地址空间,任何不在堆栈上声明32KB数组的理由
- 要声明指针变量,内存是否分配给指针的名称或指针的地址?
- 如何在特定地址声明结构体