ODR-使用转发的 constexpr 参数
odr-use of forwarded constexpr argument?
在下面...
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
是你的c
,ex
是id表达式c
。唯一ex
是潜在结果的表达式是 id 表达式ex
本身。它既不是丢弃的值表达式,也不是应用于它的左值到右值转换(因为它绑定到引用)。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- MSVC 和函数参数的 constexpr?
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 从非类型模板参数声明 constexpr 数组的可移植方法
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 调用模板参数 constexpr 方法?
- constexpr 运算符重载使用参数的问题
- 使用模板参数还包括 constexpr 成员函数enable_if单独定义和声明模板成员函数
- 当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗
- 类成员参数中的Constexpr
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 在if constexpr中使用带参数包的概念时,升级到gcc 9后出现编译错误
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 不接受静态成员函数作为 constexpr 参数
- ODR-使用转发的 constexpr 参数
- 为什么不允许使用'constexpr'参数?
- 如果直接使用 constexpr-function,则认为 constexpr 参数,但如果用于调用另一个 conste
- 代码中奇怪的constexpr参数