【发布时间】:2015-12-01 10:26:28
【问题描述】:
(在my recent question 和another question 之后。)
[expr.const]/4 表示:
类型 T 的转换常量表达式是一个表达式,隐式 转换为 T 类型,其中 转换后的表达式 是一个常量 表达式和隐式转换序列只包含
- ...(省略列表)
以及引用绑定(如果有)直接绑定的位置。
(强调我的。)
这里有两点不太明白。
首先,“转换后的表达式”(强调)指的是哪个表达式?
例如考虑
class A; // assume it can be implicitly converted to `int`
A foo(); // or maybe constexpr
template<int n> void bar();
现在,如果我写
bar<foo()>();
那么哪个表达式应该是常量表达式?整个 foo() 表达式应该保持不变,还是像 static_cast<int>(foo()) 这样的表达式?
根据我对my recent question 的了解,只有后者需要保持不变。这是真的吗?
第二,“引用绑定”指的是整个流程的哪个阶段?它是否仅指模板参数本身是引用(template<int& x>...)的情况?或者它是否要求在转换表达式的类型转换或评估期间某处发生的任何引用绑定都应该是直接的?还是指未转换的表达式本身是引用的情况(A& a=...; bar<a>();)?
【问题讨论】:
标签: c++ language-lawyer