为什么clang不能将元组的构造限制为明确的?

时间:2019-06-01 07:08:36

标签: c++ tuples c++17 standard-library explicit

[tuple.cnstr]/6

EXPLICIT constexpr tuple();
     

效果:值初始化每个元素。

     

备注:此构造函数不得参与重载解析   除非is_­default_­constructible_­v<Ti>对所有i为真。   [注意:此行为可以通过构造器模板实现   带有默认模板参数。 — 尾注]   构造函数是显式的,当且仅当   Ti不是隐式的   默认情况下至少可以构造一个 i [注意:   可以用特征来实现,该特征检查const Ti&是否可以用{}初始化。   — 尾注]

因此,以下代码

#include <tuple>

struct A {
  explicit A() = default;
};

int main()
{
  [[maybe_unused]] std::tuple<A> x = {};
}

格式错误,因为std::tuple<A>的默认构造函数是显式的。 GCC 9.1.0正确地引发错误。但是,它可以在Clang 8.0.0上正常编译。

这是libc++中的相关代码:

template <class ..._Args>
static constexpr bool __enable_default() {
    return __all<is_default_constructible<_Args>::value...>::value;
}

还有constructor

template <bool _Dummy = true, class = typename enable_if<
    _CheckArgsConstructor<_Dummy>::template __enable_default<_Tp...>()
>::type>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR tuple()
    _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}

似乎libc ++甚至没有想到要实现这一点。 我的理解正确吗,这是一个错误?

0 个答案:

没有答案