澄清已转换的常量表达式定义

时间:2015-12-01 10:26:29

标签: c++ language-lawyer

(关注my recent questionanother 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>();)?

1 个答案:

答案 0 :(得分:4)

  

首先,哪个表达式&#34;转换后的表达式&#34; (emphased)   参考?

隐式转换引入了相应初始化的临时转换:

T e = /* original expression */;

e是&#34;转换后的表达式&#34;。在你的情况下T = int

  

然后哪个表达式应该是常量表达式?

e

此外,foo 已隐式调用的转换运算符函数必须是[expr.const]/(2.2)的constexpr函数。

  

其次,整个过程的哪个阶段做&#34;引用绑定&#34;参考   到?

T是引用类型时,上述示例中的引用 - e将直接绑定。在表达内部或感兴趣之前不需要绑定。