不完整类型上的std :: is_constructible

R_K*_*app 30 c++ language-lawyer c++11

我有以下代码:

#include <iostream>

class A;

int main()
{
    std::cout << std::is_constructible<A>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

当我使用GCC 8.3时,此代码会编译。但是,当我使用Clang 8.0时,出现编译错误,即不能在类型特征中使用不完整的类型。

哪一个是正确的?是否允许我使用is_constructible不完整的类型(预期值为false),还是不允许我使用?

Sto*_*ica 26

该行为是不确定的。

[meta.unary.prop]

template <class T, class... Args> struct is_constructible;
Run Code Online (Sandbox Code Playgroud)

T并且参数包中的所有类型Args均应为完整类型(可能是经过cv限定)的无效类型或未知范围的数组。

这是元功能的前提。您的代码违反的合同。通过通知您,libc ++很慷慨。


提醒您,将先决条件放在此处,否则将其保留未定义是有原因的。模板的两个实例化点具有不同含义的程序是格式错误的NDR。唯一明智的做法是需求完整类型。毕竟,无论如何,该特性才是最有用的。


Nel*_*yan 18

您的代码导致未定义的行为。

Cppreference状态:

template< class T, class... Args > struct is_constructible;

T和参数包Args中的所有类型均应为完整类型,(可能是cv限定)void或未知范围的数组。否则,行为是不确定的。


Nat*_*ica 9

您的代码具有未定义的行为。根据[meta.unary.prop]表47的 std::is_constructible要求

T模板参数包中的所有类型Args应为完整类型cv void或未知边界数组。

重点矿