我注意到libstdc ++的std::ignore
实现采用const T&
参数,该参数不能绑定到易失性rvalue。因此,以下代码无法编译:
#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)
这是否违反了标准,或者是否存在导致此未定义行为的子句?
答案 0 :(得分:0)
我不是语言律师,所以我将尽可能直接回答这个问题。
ignore
位于tuple.general
中tuple
的概要中:
// [tuple.creation], tuple creation functions:
const unspecified ignore;
正如您所注意到的,libstdc++实现定义了ignore
,如下所示:
// A class (and instance) which can be used in 'tie' when an element
// of a tuple is not required
struct _Swallow_assign
{
template<class _Tp>
const _Swallow_assign&
operator=(const _Tp&) const
{ return *this; }
};
libc++版本定义如下:
template <class _Up>
struct __ignore_t
{
template <class _Tp>
_LIBCPP_INLINE_VISIBILITY
const __ignore_t& operator=(_Tp&&) const {return *this;}
};
因此,它在libc ++中编译。现在std::tie
的定义可以在[tuple.creation]中找到,其中包含:
返回:
tuple<Types&...>(t...)
。当t
中的参数是。时ignore
,为相应的元组元素赋值 没有效果。
这并没有说明ignore
本身的任何内容,所以我要将其归结为未指定的行为。您可以通过省略来证明它是未定义的行为,但这可能会延长它。
答案 1 :(得分:0)
<强>注释:强>
var MySchema = new Schema({
active: { type: Boolean, required: true, default: true },
myvar: {
useDefault: { type: Boolean, required: true },
custom: { type: String },
default: { type: String }
}
});