Обновление: условное явление внесено в черновик С++ 20. больше о cppreference
Страница конструктора cppreference std :: tuple содержит несколько заметок на С++ 17, в которых говорится следующее:
Этот конструктор является
explicit
тогда и только тогда, когдаstd::is_convertible<const Ti&, Ti>::value
имеетstd::is_convertible<const Ti&, Ti>::value
false по крайней мере для одногоi
Как можно написать конструктор, который является явно явным? Первой возможностью, которая пришла на ум, был explicit(true)
но не юридический синтаксис.
Попытка с enable_if
не удалась:
// constructor is explicit if T is not integral
struct S {
template <typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
S(T) {}
template <typename T,
typename = typename std::enable_if<!std::is_integral<T>::value>::type>
explicit S(T) {}
};
с ошибкой:
error: ‘template<class T, class> S::S(T) cannot be overloaded
explicit S(T t) {}