为什么ostream不能转换成ostream?

时间:2017-03-28 13:11:10

标签: c++ c++11 gcc

我正在我的项目中进行一些类型检查。以下示例

using namespace std;

cout << ( is_convertible<ostream,ostream>::value ? "TRUE":"FALSE" ) << endl;

返回“FALSE”。

有人可以解释原因吗?

3 个答案:

答案 0 :(得分:9)

is_convertible测试是否有虚函数

 To test() { return std::declval<From>(); }

格式正确(source)。

std::ostreamstd::basic_ostream<char>的别名。它的复制构造函数被删除,其移动构造函数受到保护。

因此test虚构函数形成不良。

简而言之,你问你是否可以从ostream移动构造一个ostream,答案是“不”。

答案 1 :(得分:3)

您无法复制ostream(在内部FILE*表示方面没有任何意义)。因此,您希望使用引用进行测试(这总是比指针更安全):

std::cout << std::is_convertible<std::ostream&,std::ostream&>::value;

答案 2 :(得分:2)

std::ostream的复制构造函数被明确删除。测试std::is_convertible<From, To>告诉您是否可以进行隐式转换,但不适用于ostream。您最有可能想要使用std::is_convertible<T*, ostream*>