我正在尝试创建一个类型特征类,以确定特定类型的T
是否可以通过std::ostream
的<<
操作符进行流式传输。我正在使用一种简单的SFINAE技术。
最终,我尝试评估替换失败的表达式是:
decltype(std::declval<std::ostream>() << std::declval<T>()) ;
我的预期是,给定一个类型为T
的实例t
和一个std::ostream
实例os
,如果表达式os << t
格式错误,则应该发生替换失败。
但是很明显,无论T
类型是什么,这里都不会发生替换失败。即使我只是使用上面的decltype
表达式声明了一个typedef
,在SFINAE的上下文之外,它也可以顺利地编译,即使T
不能与std::ostream
一起使用。
例如:
struct Foo { };
int main()
{
// This compiles fine using GCC 4.9.2
//
typedef decltype(
std::declval<std::ostream>() << std::declval<Foo>()
) foo_type;
}
上面的代码使用GCC 4.9.2可以很好地编译,这并不是我所期望的,因为使用Foo
类型时<<
运算符不会被重载。当然,如果我说:
std::cout << Foo();
..。我得到一个编译器错误。那么,为什么上面的decltype
表达式还要编译呢?
https://stackoverflow.com/questions/37480778
复制相似问题