odr使用转发的constexpr参数?

And*_*zos 5 c++ c++14

在下面的...

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?为什么/为什么不呢?

Ker*_* SB 4

通过与Richard 的回答中相同的动作,我们发现被 ODR 使用的第二个条件被违反,因此c ODR 使用。具体来说,条件如下:

[变量x由表达式odr 使用ex,除非x是对象,并且]ex是表达式 的潜在结果集的元素e,其中左值到右值转换应用于e,或者e是丢弃值表达式。

在我们的例子中,x标准中的 是你的cex是 id-expression c。唯一ex可能产生结果的表达式是 id 表达式ex本身。它既不是丢弃值表达式,也没有对其应用左值到右值转换(因为它绑定到引用)。