考虑一个小的独立使用案例,我希望通过使用以下方法确定类型是完整还是不完整:
#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;
}
这段代码使用
--std=c++11
标志,可以在gcc 4.9.3
中编译成功。但是,在gcc 6.1
和--std=c++11
条件下,它会产生编译错误。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();
我在这里错过了什么?可能有什么解决方法?
operator()(...)
吗?它试图复制一个不完整的类型。 - Piotr Skotnickinamespace
,而是使用命名空间吗? - user3405291FooIncomplete
在一个上下文中完成但在另一个上下文中未完成时会发生什么,并且两者都尝试使用你的技巧?我认为结果不太好。 - Yakk - Adam NevraumontFooIncomplete::~FooIncomplete
的存在。 请参考如何使用SFINAE检测类的存在?。 - Mike Kinghan