【发布时间】:2016-09-12 17:15:52
【问题描述】:
为什么通过 const 引用传递参数总是 意味着对象是 ODR 使用的?我明白了,因为标准是这样定义的,但为什么至少对整数常量没有例外?
例如(我自己几个小时前回答的例子):
struct T {
static constexpr int i = 42;
};
void check(const int& z);
int main() {
check(T::i); // <- 1
check(42); // <- 2
}
(1) 行将在链接时触发错误 - 标准认为它是使用 T::i 的 ODR,并且看不到定义。但是,标准对于示例(2) 没有问题。既然(2) 必须工作,为什么(1) 不能为intgeral constexpr 工作?我意识到通常您需要获取对象的地址才能通过引用传递它,但在数字文字的情况下肯定不需要。为什么标准不会为某些 constexpr 类型创建异常?
只是为了避免标准中有太多的例外吗?但我认为允许上述用法非常有益!还有什么我没看到的吗?
【问题讨论】:
-
如果您告诉我们
x是什么以及check做了什么,您所写的内容会更有意义,就像您在此处所做的那样:stackoverflow.com/a/37259949/3758484 -
简单回答:没有x
-
我想知道为什么人们不赞成这个问题。我也想知道为什么它“主要基于意见” - 没有任何意见,@Barry 确实解释得很好。
-
最简单的解决方案是按值传递。
-
@AlanStokes,好吧,我认为这里的人们理解示例的价值,而不是真正的代码。在实际代码中,
check()将是一个模板,并且不适合按值传递。
标签: c++ language-lawyer constexpr