libstdc ++是否错误拒绝将volatile的rvalue赋值给std :: ignore?

时间:2016-06-20 22:14:03

标签: c++ c++11 g++ tuples language-lawyer

我注意到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

这是否违反了标准,或者是否存在导致此未定义行为的子句?

2 个答案:

答案 0 :(得分:0)

我不是语言律师,所以我将尽可能直接回答这个问题。

ignore位于tuple.generaltuple的概要中:

// [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 }
  }
});