Below is the snippet which is trying to check for the presence of a default constructor at compile time. Compiling this with
clang version 11.0.0
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /usr/local/opt/llvm/bin
using options clang++ --std=c++17 -o test_default_ctor test_default_ctor.cpp
#include <type_traits>
template<typename T, typename = void>
struct has_default_ctor_1 : std::false_type {};
template<typename T>
struct has_default_ctor_1<T, std::void_t<decltype(T())>> : std::true_type {};
template<typename T, typename = void>
struct has_default_ctor_2 : std::false_type {};
template<typename T>
struct has_default_ctor_2<T, std::void_t<decltype(T{})>> : std::true_type {};
struct Test1 {
Test1() = default;
};
struct Test2 {
Test2() {}
};
struct Test3 {
Test3() = delete;
};
int main() {
static_assert(has_default_ctor_1<Test1>::value, "Test has default ctor");
static_assert(has_default_ctor_2<Test1>::value, "Test has default ctor");
static_assert(has_default_ctor_1<Test2>::value, "Test has default ctor");
static_assert(has_default_ctor_2<Test2>::value, "Test has default ctor");
static_assert(not has_default_ctor_1<Test3>::value, "Test has default ctor");
static_assert(not has_default_ctor_2<Test3>::value, "Test has default ctor");
}
the output of compilation will be
test_default_ctor.cpp:33:5: error: static_assert failed due to requirement '!has_default_ctor_2<Test3, void>::value' "Test has default ctor"
static_assert(not has_default_ctor_2<Test3>::value, "Test has default ctor");
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
The question is why using ()
vs {}
for constructor call in the template specialization makes it work in one case but not in the other?
Aucun commentaire:
Enregistrer un commentaire