C ++ 0x:条件运算符,xvalues和decltype

时间:2010-10-11 20:31:51

标签: c++ c++11 rvalue-reference defects

我在这里重新发布comp.std.c++ Usenet discussion,因为该群体变得非常不可靠。我在那里提交的最后几篇文章已经进入虚空状态,活动几乎停止了。我怀疑我被禁止和/或其他所有人都失去了兴趣。希望所有感兴趣的人都能找到这个讨论,并且会有一般的迁移。也许他们会任命一位新的主持人。


您好!

我目前对N3126草案的解释w.r.t.有条件的 运算符和xvalues,我希望以下断言能够成立:

 int i = 0;
 int& j = true? i : i;
 int&& k = true? std::move(i) : std::move(i);   // #2
 assert(&i == &j); // Holds since C++98
 assert(&i == &k); // Should this hold as well?

5.16 / 4说:

  

如果第二和第三个操作数[to   条件运算符]   相同价值类别的glvalues   并且具有相同的类型,结果是   该类型和价值类别[...]

尽管如此,它并没有明确说明产生的glvalue指的是 glvalue操作数引用的对象之一 - 或者就是这个 暗示,否则它会返回一个prvalue?使用GCC 4.5.1 在C ++ 0x模式下,第二个断言失败。参考k似乎 指一些临时对象。有人可以澄清是否 允许comiler在两个操作数的情况下创建这样的临时 在冒号周围是相同类型的x值?

我目前认为GCC是错误的和/或不是最新的尊重 到xvalues。

后续问题是:能够检测到它是不是很好 表达式的值类别?如果我们忽略条件运算符 我们可以用decltype检测表达式的值类别。但 什么是

 bool xvalue = std::is_rvalue_reference<
   decltype( true ? std::move(i) : std::move(i) ) >::value;

应该屈服?使用GCC 4.5.1,初始化xvalue变量 假的。这符合当前的标准草案吗?

TIA, 塞巴斯蒂安

1 个答案:

答案 0 :(得分:2)

我认为GCC 4.5.1是不合格的§5.16/ 4。你有filed a bug report吗?

无论如何,我认为它符合那个三元运算符代码。 decltype由§7.1.6.2/ 4定义:

  

decltype(e)表示的类型是   定义如下:

     
      
  • 如果e是未加密码的id-expression或类成员访问   (5.2.5),decltype(e)是类型   由e命名的实体。如果没有   这样的实体,或者如果e命名一组   重载函数,程序是   不良形成的;
  •   
  • 否则,如果e是函数调用(5.2.2)或调用   重载运算符(括号   在e周围被忽略),decltype(e)是   静态的返回类型   选择的功能;
  •   
  • 否则,如果e是左值,则decltype(e)是T&amp;,其中T是类型   e;
  •   
  • 否则,decltype(e)是e的类型。 decltype的操作数   说明符是未评估的操作数   (第5条)。
  •   

decltype通过获取适当的声明并从中返回所需的类型来工作。它对于非重载运算符几乎没有智能。也许还有另外一点

  • 否则,如果e是xvalue,则decltype(e)为T&&,其中Te的类型

将按顺序排列,特别是因为如上所述,xvalues被视为prvalues。此外,您的表达式完全符合std::common_type的定义(§20.7.6.6/ 3)。

一个简单的解决方法(硬币短语:vP):

template< typename T1, typename T2 >
struct common_type_and_category {
    typedef typename std::conditional<
        std::is_same< T1, T2 >::value,
        T1,
        typename std::common_type< T1, T2 >::type
    >::type type;
};