【发布时间】:2021-10-04 23:34:37
【问题描述】:
我想写一个 C++ 函数来检查它的模板参数类是不完整的,所以只有类声明可用,而不是所有类成员的完整定义。
我的函数incomplete()加上一些演示程序如下所示:
#include <type_traits>
#include <iostream>
template <typename T, typename V = void> constexpr bool is_incomplete = true;
template <typename T> constexpr bool is_incomplete<T, std::enable_if_t<sizeof(T)>> = false;
template <typename T> constexpr bool incomplete() { return is_incomplete<T>; }
struct A;
void print() { std::cout << incomplete<A>(); }
struct A {}; //this line affects GCC
int main()
{
print();
}
它在 Clang 打印 1 中运行良好,但在 GCC 中程序打印 0,尽管事实上 A 类在函数 print 中不完整。
https://gcc.godbolt.org/z/qWW3hqbEv
这里是 GCC 错误还是我的程序有问题?
【问题讨论】:
-
is_complete/is_incomplete很容易出现 ODR 违规/不一致的结果。 EOF 是一个有效的实例化点。对于函数,每个实例化的定义应该相同,对于类,它只实例化一次。不确定模板变量。 -
但我认为那里的大多数答案都存在与您相同/相似的问题
-
这可能是唯一正确的:stackoverflow.com/a/21119631/4117728
标签: c++ sfinae incomplete-type