当使用SFINAE检测默认类型是否可构造模板类型时,我刚刚观察到libc++的一个奇怪问题。
以下是我能够提出的一个最小示例:
#include <iostream>
#include <type_traits>
template <typename T>
struct Dummy;
template <>
struct Dummy<int>{};
template <typename T, typename = void>
struct has_dummy : std::false_type {};
template <typename T>
struct has_dummy<C, std::enable_if_t<std::is_default_constructible<Dummy<T>>::value>> : std::true_type{};
int main() {
std::cout << std::boolalpha << has_dummy<int>{}() << '\n';
std::cout << std::boolalpha << has_dummy<double>{}() << '\n';
}
当使用
true
时,使用g++或clang++编译时,它将编译并输出预期的行false
和libstdc++
。但是,当我尝试使用libc++(即clang++ -stdlib=libc++ -std=c++1z test.cpp
)对其进行编译时,出现以下错误:这是libc++的
std::enable_if
或std::is_default_constructible
实现中的错误,还是我正在以某种方式调用未定义/实现特定行为的行为?最好的
科里斯托
最佳答案
is_default_constructible
的前提条件非常清楚:
并且根据以下内容,您的程序表现出未定义的行为:
关于c++ - SFINAE,其中std::enable_if和std::is_default_constructible用于libc++中的不完整类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40821950/