【发布时间】:2017-03-02 08:03:19
【问题描述】:
考虑一个小的独立用例,其中我想确定一个类型是完整的还是不完整的使用
#include <type_traits>
namespace {
struct foo {
template<class T, std::size_t = sizeof(T)>
std::false_type operator()(T&);
std::true_type operator()(...);
};
struct FooIncomplete;
}
int main() {
std::result_of<foo(FooIncomplete&)>::type();
return 0;
}
这与 gcc 4.9.3 和 --std=c++11 标志编译得很好。但是,使用 gcc 6.1 和 --std=c++11 它会生成 compilation error
main.cpp: In function 'int main()':
main.cpp:17:5: error: 'type' is not a member of 'std::result_of<{anonymous}::foo({anonymous}::FooIncomplete&)>'
std::result_of<foo(FooIncomplete&)>::type();
我在这里缺少什么?有什么可能的解决方法?
【问题讨论】:
-
看起来像 g++ 回归
-
@Arunmu 那么 g++ 应该选择
operator()(...)吗?它试图复制一个不完整的类型 -
您是否尝试过不使用匿名
namespace,即使用命名的。 -
您是否考虑过当两个
FooIncomplete在一个上下文中完成但在另一个上下文中不完整时会发生什么(根据标准),并且都尝试了您的技巧?我不认为结果是……好。 -
可能的解决方法是 SFINAE 探测
FooIncomplete::~FooIncomplete的存在。见How to detect existence of a class using SFINAE?
标签: c++ c++11 gcc result-of gcc6