- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
#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_ostream
和 basic_string
.
关于string - 为什么 wcout << "";可以,但是 wcout << string();不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14696997/
#include #include using namespace std; int main() { wcout basic_ostream& operator& out, c
本质上,稍微修改一下代码“Hello World”应该可以正常工作 #include #include using namespace std; int main(){ wcout<
这个问题在这里已经有了答案: How can I output these symbols in c++ (2 个答案) 关闭 3 年前。 我很惊讶地看到 std::wcout 不会在字符串中打印正
如何在消息框中显示文件名和一些字符串? 我使用这段代码: wcout<
我一直在尝试为项目编写 C++ 应用程序,但遇到了这个问题。基本上: class OBSClass { public: wstring ClassName; uint8_t Credi
我试图在 Windows 命令提示符中写出以下字符:ュ (U+FF6D)。 我能够看到使用 WriteConsoleW 写出的字符。如果我使用 WideCharToMultiByte 使用 CP_AC
我在控制台应用程序中使用 wcout 时注意到一个奇怪的问题。 调用某个函数后,其余的wcout调用根本不起作用。即输出语句没有出现在控制台上。 我注意到在函数中,我使用了一个从未分配过的宽字符数组。
我使用 wcin 是为了在 wchar_t 中存储单个字符。然后我尝试使用 wcout 调用和法语字符 'é' 打印它:但我无法在我的控制台上看到它。 我的编译器是 g++ 4.5.4,我的操作系统是
这是 this question 的一种重复.我遵循了建议(我认为)并包含了 但是我的脸上出现了完全相同的错误: error C2679: binary ' #include using names
一段时间以来,我一直在用这个问题撞墙。我只是想制作一个简单的应用程序来读取文件的内容。下面是一些代码: errno_t error; if ((error = fopen_s(&f, file, "r
我正在读取一个 UTF-8 编码的 unicode 文本文件,并将其输出到控制台,但显示的字符与我用来创建该文件的文本编辑器中的字符不同。这是我的代码: #define UNICODE #includ
问题是 MinGW 编译的程序在通过 wcout 在控制台上打印非 ascii 字符时存在问题,输出可能显示来自不同代码页的字符或完全空白。但是 winapi WriteConsoleW 工作得很好。
这个问题在这里已经有了答案: Can a local variable's memory be accessed outside its scope? (20 个答案) How to return
我尝试用 C++ 重新创建 Windows Reg.exe 实用程序。具体来说,在 REG.exe 中完成以下命令所带来的功能。 REG QUERY "HKLM\Software" /s 但是,当我将
我正在阅读“C++ Cookbook”,其中包含以下片段: // cout << s << std::endl; // You shouldn't be able to wcout << ws
我想在 Ubuntu 20.04 上读取一个 txt 编码的 UTF8 文件。 我在 wcout cout 和 ifstream 中添加了一个语言环境 fr_FR.UTF-8。 我在想只添加语言环境就
我正在尝试使用 unicode 字符在终端中绘制一些简单的方框图。但是我注意到 wcout 不会为方框图字符输出任何内容,甚至不会输出占位符。所以我决定编写下面的程序并找出支持哪些 unicode 字
这个问题在这里已经有了答案: What does the 'L' in front a string mean in C++? (7 个答案) 关闭 8 年前。 有什么区别 std::wcout <
为什么 std::wcout #include int main() { std::locale::global (std::locale ("en_US.UTF-8")); st
我有一个名为“提示”的 std::map,声明如下: std::map, std::allocator >> prompts; 它存储 int 'key' 和 wstring 'value' 对。如果
我是一名优秀的程序员,十分优秀!