我在这里重新发布一个comp.std.c++ Usenet 讨论,因为该组变得非常不可靠。我在那儿提交的最后几篇文章已经无效,活动几乎停止了。我怀疑我被禁止和/或其他人只是失去了兴趣。希望所有感兴趣的人都能找到这个讨论,并且会有一个普遍的迁移。也许那时他们会任命一位新的主持人。
你好!
根据我目前对条件运算符和 xvalues 的 N3126 草案的解释,我希望以下断言成立:
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 说:
如果第二个和第三个操作数 [对条件运算符] 是相同值类别的左值并具有相同类型,则结果是该类型和值类别 [...]
虽然,它并没有清楚地说明生成的 glvalue 指的是 glvalue 操作数所指的对象之一——或者这是暗示的,否则它会返回一个纯右值?在 C++0x 模式下使用 GCC 4.5.1,第二个断言失败。引用 k 似乎是指一些临时对象。如果冒号周围的两个操作数都是相同类型的 xvalue,有人可以澄清是否允许编译器创建这样的临时变量?
我目前假设 GCC 是错误的和/或就 xvalues 而言不是最新的。
接下来的问题是:能够检测出表达式的值类别不是很好吗?如果我们忽略条件运算符,我们可以使用 decltype 检测表达式的值类别。但是什么是
bool xvalue = std::is_rvalue_reference<
decltype( true ? std::move(i) : std::move(i) ) >::value;
应该屈服?使用 GCC 4.5.1,xvalue 变量被初始化为 false。这符合当前的标准草案吗?
TIA,塞巴斯蒂安