为什么是wcout<< " ";没问题,但 wcout <<字符串();莫?
Why is it that wcout << ""; is OK but wcout << string(); is not?
#include <iostream>
#include <string>
using namespace std;
int main()
{
wcout << L"Hello"; // OK.
wcout << wstring(L"Hello"); // OK.
wcout << "Hello"; // OK. Why?
wcout << string("Hello"); // Error. Why?
}
为什么std::wcout
接受窄字符串文字作为其参数,但不接受窄字符串对象?
这是由C++11标准的§27.7.3.6.4规定的,其中指定了以下两个过载运算符(以及其他运算符(:
template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(
basic_ostream<charT,traits>& out,
const charT* s
);
template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(
basic_ostream<charT,traits>& out,
const char* s
);
最后一个重载显式地处理基于char
的C字符串。这意味着,即使对于具有参数wchar_t
的basic_ostream<>
类模板的实例化,也将存在一个重载,该重载将处理狭窄的char
字符串。
此外,根据§27.7.3.6.4/5:
按照22.4.2.2.2中的说明确定填料从s开始的n个字符使用out.widen(27.5.5.3(进行加宽。加宽的字符和任何所需的填充都插入out中。调用宽度(0(。
另一方面,语句
wcout << string("Hello");
不编译,因为string
没有到const char*
的隐式转换,并且因为没有operator <<
的重载,该重载将使用一个字符类型构建的string
插入到具有不同底层字符类型的输出流中。在标准术语中(见§21.4.8.9(,以下是std::string
:过载operator <<
的定义
template<class charT, class traits, class Allocator>
basic_ostream<charT, traits>& operator<<(
basic_ostream<charT, traits>& os,
const basic_string<charT,traits,Allocator>& str
);
如您所见,相同的模板参数charT
用于实例化basic_ostream
和basic_string
。
对于第一个,我猜使用了这个重载:
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const char* s );
其中CCD_ 16本质上是CCD_。
为什么string("Hello")
不起作用,只是因为没有从string
到wstring
的转换,也没有提供operator<<
的过载。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- wcout不会打印正确的单引号
- 使用std::wcout会降低奇怪的性能
- Printing CComBSTR with iostream (std::wcout)
- 这段 C++ 代码的奇怪行为(std::wcout 和 std::exception)
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 使用 wstring 和 wcout 无法获得预期的输出
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 将char8_t const* 输出到 cout 和 wcout,一个编译一个不编译
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败