在下面的...
struct C {};
constexpr C c;
void g(C);
template<typename T>
void f(T&& t) {
g(std::forward<T>(t));
}
int main() {
f(c);
}
Run Code Online (Sandbox Code Playgroud)
是否使用了codr?为什么/为什么不呢?
通过与Richard 的回答中相同的动作,我们发现不被 ODR 使用的第二个条件被违反,因此c 被ODR 使用。具体来说,条件如下:
[变量
x由表达式odr 使用ex,除非x是对象,并且]ex是表达式 的潜在结果集的元素e,其中左值到右值转换应用于e,或者e是丢弃值表达式。
在我们的例子中,x标准中的 是你的c,ex是 id-expression c。唯一ex可能产生结果的表达式是 id 表达式ex本身。它既不是丢弃值表达式,也没有对其应用左值到右值转换(因为它绑定到引用)。