【发布时间】:2019-09-13 20:06:05
【问题描述】:
我有以下代码:
#include <iostream>
class A;
int main()
{
std::cout << std::is_constructible<A>::value << std::endl;
}
当我使用GCC 8.3 时,此代码会编译。但是,当我使用Clang 8.0 时,我收到一个编译错误,即不能在类型特征中使用不完整的类型。
哪一个是正确的?我是否可以在不完整的类型上使用is_constructible(预期值为false),还是不允许?
【问题讨论】:
-
如果
A不是一个完整的类型,is_constructible将如何确定A是否可构造? -
@FrançoisAndrieux:如果
A不完整,我们就无法构造它(A a;在不完整的类上A会导致编译器错误)——这就是它的工作方式我们过去的代码库,但由于未定义的行为,这似乎只是运气。 -
回复:“我们不能构造它”——类型特征是关于类型的属性。如果
std::is_constuctible<A>根据您包含的标题更改其结果,那将是非常令人不安的。在一个地方它是可构造的,而在另一个地方它不是? -
@PeteBecker:这是一个我没有考虑过的公平点——最初的用例是一个模板化的
class A,它只实例化了特定的参数。然后我们将 SFINAE 与std::is_constructible一起使用,以便只允许某些类型的类型通过。这很容易通过显式实例化默认的class A来正确完成,其中显式删除了构造函数(这是我所做的),但思考过程是从那个角度出发的。没有考虑(应该很明显的)“实际存在的前向声明类”角度......
标签: c++ c++11 language-lawyer