gpt4 book ai didi

string - 为什么 wcout << "";可以,但是 wcout << string();不是?

转载 作者:IT老高 更新时间:2023-10-28 22:29:38 26 4
gpt4 key购买 nike

#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 字符串。这意味着即使是 basic_ostream<> 的实例化带参数的类模板 wchar_t将有一个重载将处理窄 char字符串。

此外,根据 § 27.7.3.6.4/5:

Padding is determined as described in 22.4.2.2.2. The n characters starting at s are widened using out.widen (27.5.5.3). The widened characters and any required padding are inserted into out. Calls width(0).


另一方面,声明 wcout << string("Hello");无法编译,因为 string没有到 const char* 的隐式转换,并且因为没有 operator << 的重载这将插入一个 string将一种字符类型构建到具有不同基础字符类型的输出流中。

在标准术语中(参见第 21.4.8.9 节),这里是重载 operator << 的定义。看起来像 std::string :

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_ostreambasic_string .

关于string - 为什么 wcout << "";可以,但是 wcout << string();不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14696997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com