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 ++甚至没有想到要实现这一点。 我的理解正确吗,这是一个错误?