当使用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++编译时,它将编译并输出预期的行falselibstdc++。但是,当我尝试使用libc++(即clang++ -stdlib=libc++ -std=c++1z test.cpp)对其进行编译时,出现以下错误:



这是libc++的std::enable_ifstd::is_default_constructible实现中的错误,还是我正在以某种方式调用未定义/实现特定行为的行为?

最好的
科里斯托

最佳答案

is_default_constructible的前提条件非常清楚:



并且根据以下内容,您的程序表现出未定义的行为:

关于c++ - SFINAE,其中std::enable_if和std::is_default_constructible用于libc++中的不完整类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40821950/

10-15 04:41