我正在我的项目中进行一些类型检查。以下示例
using namespace std;
cout << ( is_convertible<ostream,ostream>::value ? "TRUE":"FALSE" ) << endl;
返回“FALSE”。
有人可以解释原因吗?
答案 0 :(得分:9)
is_convertible
测试是否有虚函数
To test() { return std::declval<From>(); }
格式正确(source)。
std::ostream
是std::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*>
。