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]
Run Code Online (Sandbox Code Playgroud)template <class T, class... Args> struct is_constructible;
T
并且参数包中的所有类型Args
均应为完整类型(可能是经过cv限定)的无效类型或未知范围的数组。
这是元功能的前提。您的代码违反的合同。通过通知您,libc ++很慷慨。
提醒您,将先决条件放在此处,否则将其保留未定义是有原因的。模板的两个实例化点具有不同含义的程序是格式错误的NDR。唯一明智的做法是需求完整类型。毕竟,无论如何,该特性才是最有用的。
Nel*_*yan 18
您的代码导致未定义的行为。
Cppreference状态:
template< class T, class... Args > struct is_constructible;
T和参数包Args中的所有类型均应为完整类型,(可能是cv限定)void或未知范围的数组。否则,行为是不确定的。
您的代码具有未定义的行为。根据[meta.unary.prop]表47的 std::is_constructible
要求
T
模板参数包中的所有类型Args
应为完整类型,cvvoid
或未知边界数组。
重点矿
归档时间: |
|
查看次数: |
1088 次 |
最近记录: |