这只是出现在另一个问题的背景下.
显然,类模板中的成员函数只有在使用ODR时才会被实例化.有人可以解释一下究竟是什么意思.关于单一定义规则(ODR)的维基百科文章未提及" ODR使用 ".
但是标准将其定义为
名称显示为潜在评估表达式的变量是odr-used,除非它是满足出现在常量表达式(5.19)中的要求的对象,并且立即应用左值到右值转换(4.1).
在[basic.def.odr]中.
编辑:显然这是错误的部分,整个段落包含不同事物的多个定义.这可能是类模板成员函数的相关内容:
一个非重载函数,其名称显示为可能已评估的表达式或一组候选函数的成员,如果从可能已评估的表达式引用时通过重载决策选择,则使用该函数,除非它是纯虚拟的函数及其名称未明确限定.
但我不明白,这个规则如何在多个编译单元中工作?如果我显式实例化一个类模板,是否所有成员函数都被实例化了?
是否可以确定在宏或函数中传递的参数在编译时或运行时是否是字符串文字?
例如,
#define is_string_literal(X)
...
...
is_string_literal("hello") == true;
const char * p = "hello";
is_string_literal(p) == false;
Run Code Online (Sandbox Code Playgroud)
要么
bool is_string_literal(const char * s);
is_string_literal("hello") == true;
const char * p = "hello";
is_string_literal(p) == false;
Run Code Online (Sandbox Code Playgroud)
谢谢.
我发现这篇文章提出了以下模板和一个用于获取数组大小的宏:
template<typename Type, size_t Size>
char ( &ArraySizeHelper(Type( &Array )[Size]) )[Size];
#define _countof(Array) sizeof(ArraySizeHelper(Array))
Run Code Online (Sandbox Code Playgroud)
我发现以下部分完全不清楚.sizeof应用于函数声明.我希望结果是"函数指针的大小".为什么它会获得"返回值的大小"呢?