【发布时间】:2016-06-20 22:14:02
【问题描述】:
我注意到 libstdc++ 的 std::ignore 实现采用 const T& 参数,该参数不能绑定到 volatile 右值。因此以下代码无法编译:
#include <tuple>
#include <utility>
struct C {};
using VC = C volatile;
int main() {
std::tuple<VC> t;
std::tie(std::ignore) = std::move(t);
}
(http://coliru.stacked-crooked.com/a/7bfc499c1748e59e)
这是否违反了标准,或者是否存在导致这种未定义行为的条款?
【问题讨论】:
-
你为什么要首先使用
volatile?它禁用优化,不会使事情线程安全。我不明白你为什么要这样做...... -
@JesperJuhl 因为它就在那里
-
不是个好理由。代码可以更改。
-
@JesperJuhl stackoverflow.com/questions/72552/why-does-volatile-exist 此外,语言律师问题有权询问无意义的(或至少是奇怪的)极端案例,将其视为一项运动。
-
这种情况并非“无稽之谈”。这是一个证明问题的最小案例。如果这是一个显示 volatile 有效使用的真实示例,人们会抱怨它不是 MCVE。
标签: c++ c++11 g++ tuples language-lawyer