我在这里重新发布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, 塞巴斯蒂安
答案 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&&
,其中T
是e
的类型将按顺序排列,特别是因为如上所述,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;
};