cppreference.com和cplusplus.com都说它是int_type,但它们没有解释(至少我找不到,必应聊天也找不到)它是什么类型(我想它可以是任何有符号整数类型,至少和char和bool一样宽)。
int_type
char
bool
cqoc49vn1#
特殊值EOF需要是比相应字符类型宽的整数类型,因为它不能与任何字符具有相同的值。在一般情况下,但不是所有情况下(!),它是-1。特征类模板std::char_traits为各个字符类型提供对应的类型:https://en.cppreference.com/w/cpp/string/char_traits例如,对于char,它是int,这与平台有关,但至少有16位宽。
EOF
std::char_traits
int
lmyy7pcs2#
当您在文档中遇到未定义的术语时,请尝试查找更高级别的文档。从std::char_traits<CharT>::eof(或std::char_traits::eof)的文档转到std::char_traits<CharT>(或std::char_traits)的文档。
std::char_traits<CharT>::eof
std::char_traits::eof
std::char_traits<CharT>
char_type
(另一行指定char_type是CharT的别名,其中CharT是模板参数。)
CharT
charT
eof()
(This接着指示当charT是char时,则int_type是int)。请注意,此类型必须比字符类型宽(不仅仅是“至少一样宽”),因为文件结束值必须与所有字符值不同。
mrphzbgm3#
你可以打印出一个特定实现的EOF类型。注意,这些类型可能因实现或平台而异,所以要注意可移植性的限制。Boost demangle只是为了易读性。
demangle
#include <iostream> #include <string> #include <typeinfo> #include <boost/core/demangle.hpp> int main() { std::cout << "char is " << boost::core::demangle(typeid(std::char_traits<char>::eof()).name()) << "\n"; std::cout << "wchar_t is " << boost::core::demangle(typeid(std::char_traits<wchar_t>::eof()).name()) << "\n"; std::cout << "char16_t is " << boost::core::demangle(typeid(std::char_traits<char16_t>::eof()).name()) << "\n"; std::cout << "char32_t is " << boost::core::demangle(typeid(std::char_traits<char32_t>::eof()).name()) << "\n"; }
3条答案
按热度按时间cqoc49vn1#
特殊值
EOF
需要是比相应字符类型宽的整数类型,因为它不能与任何字符具有相同的值。在一般情况下,但不是所有情况下(!),它是-1。
特征类模板
std::char_traits
为各个字符类型提供对应的类型:https://en.cppreference.com/w/cpp/string/char_traits例如,对于
char
,它是int
,这与平台有关,但至少有16位宽。lmyy7pcs2#
当您在文档中遇到未定义的术语时,请尝试查找更高级别的文档。从
std::char_traits<CharT>::eof
(或std::char_traits::eof
)的文档转到std::char_traits<CharT>
(或std::char_traits
)的文档。int_type
一个整数类型,可以保存char_type
加上EOF
的所有值“(另一行指定
char_type
是CharT
的别名,其中CharT
是模板参数。)int_type
可表示所有charT
值以及eof()
的整数类型“(This接着指示当
charT
是char
时,则int_type
是int
)。请注意,此类型必须比字符类型宽(不仅仅是“至少一样宽”),因为文件结束值必须与所有字符值不同。
mrphzbgm3#
你可以打印出一个特定实现的EOF类型。注意,这些类型可能因实现或平台而异,所以要注意可移植性的限制。
Boost
demangle
只是为了易读性。