ODR-使用转发的 constexpr 参数

odr-use of forwarded constexpr argument?

本文关键字:constexpr 参数 转发 ODR-      更新时间:2023-10-16

在下面...

struct C {};
constexpr C c;
void g(C);
template<typename T>
void f(T&& t) {
  g(std::forward<T>(t));
}
int main() {
  f(c);
}

是否使用c ODR? 为什么/为什么不呢?

通过与理查德的回答相同的动作,我们发现违反了不使用 odr 的第二个条件,因此c odr 使用。详细地说,条件如下:

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

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