输出 char8_t const* 到 cout 和 wcout,一编译一不

2023-12-13

Since P1423R1为 char8_t、char16_t 和 char32_t 添加已删除的 ostream 插入器,如果我们希望将这些类型流式传输到 ostream,我们暂时会遇到需要编写自定义运算符的情况。尝试对 MSVC 2019 16.2.0 Preview 2.0 执行此操作时。

#include <iostream>
#include <string>

using namespace std::literals;

template<typename Tostream>
Tostream&
operator<<( Tostream& os, std::u8string_view string ) {
  return os;
}

template<typename Tostream>
Tostream&
operator<<( Tostream& os, char8_t const* string ) {
  return os << std::u8string_view( string );
}

/// this must be commented out to compile
//std::ostream&
//operator<<( std::ostream& os, char8_t const* string ) {
//  return os << std::u8string_view( string );
//}


int
main() {
  std::cout << u8"utf-8"; 
  std::wcout << u8"utf-8";
}

我发现我的模板化尝试成功了wcout但不会编译cout除非我取消注释非模板operator<< for char8_t const *.

error C2280:  'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char8_t *)': attempting to reference a deleted function

那么问题来了,什么情况下才是正确的呢?不编译是正确的吗cout或者编译是错误的wcout?无论哪种方式,这似乎都是错误。


P1423 尚未被 C++20 接受(尽管它确实通过了 Kona 的 LEWG 审查),因此有趣的是 Microsoft 已经实现了(部分)它。

所表现出的行为与 P1423R1 中指定的行为相符。在最近的一次 LWG 审查中,要求char8_t, char16_t, and char32_t对于宽流,相关的重载也将被删除。 P1423R2 包含该更改,因此示例代码的编译也将失败std::wcout当/如果实施的话。该修订尚未在邮件中发布,但可以在以下位置预览https://rawgit.com/sg16-unicode/sg16/master/papers/p1423r2.html.

正如@Nicol 提到的,我们还没有就删除的重载的行为应该是什么达成共识。他们应该隐式转码吗?如果是这样,如何处理转码错误?或者他们应该只传输字节?但如果codecvt已附加facet(它将期望执行编码)。是否应该有一个std::u8out?或者我们应该提供更好的转码工具并要求显式调用它们? SG16 将致力于回答 C++23 的这些问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输出 char8_t const* 到 cout 和 wcout,一编译一不 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 如何将智能表“st-search”与 ng-model 集成?

    如何在Smart Table上设置不考虑用户输入的输入搜索值 这是我的代码 当用户单击复选框时 输入字段会自动输入 Sam 但表记录不会被过滤 并更新 这是我的代码 div class container table class table
  • Codeigniter:在非对象上调用成员函数 result_array()

    我正在使用 Codeigniter 构建 web 应用程序 但收到此错误 Fatal error Call to a member function result array on a non object in var www appli
  • 在其他下拉菜单中选择后禁用下拉选项

    我有 12 个下拉输入区域 一年中的每个月份都有 1 个 每个下拉菜单都有相同的 24 个选项 我需要这样做 例如 如果您在 一月 下拉框中选择了选项 4 则无法在任何其他下拉菜单中选择该选项 4 它仍然在下拉列表中 但只是被禁用 这将有一
  • ID 令牌中缺少 Azure AD v2.0 特定的可选声明

    我正在尝试使用 Microsoft Identity Web NuGet 添加可选声明 以在 NET Core 3 1 WebApp 中进行用户身份验证 阅读 MS 文档 似乎唯一需要的步骤是在 Azure 中的应用程序注册清单文件中声明可
  • 如何使用Data.Functor.Invariant?

    有人可以给我举个例子吗 invmap a gt b gt b gt a gt f a gt f b Invariant 有什么用呢 大多数情况下 人们don t use Invariant 您想要这样做的原因是 如果您正在使用其中变量同时出
  • iPhone利用进度条定时器实现流畅动画

    我试图本着学习的精神在iPhone上实现一个简单的测验应用程序 这个应用程序的一部分是一个计时器 我希望我的计时器从 10 倒数到 0 我有一个简单的 NSTimer 它每秒重复并调用一个方法 在这个方法中我更新了一个显示剩余时间的标签 效
  • 如何在Delphi中使用CCR.EXIF从JPG EXIF读取GPS坐标?

    使用 GPSLatitude 和 GPSLatitude 属性分配方法设置 GPS 坐标非常容易 但读取坐标却让我难住了 我试图访问 TGPSLongitude 类 但没有任何属性或方法可以为我呈现真实的 浮点的 甚至 DMS 的坐标 示例
  • 如何在没有单独的图标文件的情况下更改 Inno Setup 卸载程序快捷方式的图标?

    是否可以在不存储单独的图标文件 到应用程序文件夹 的情况下更改 开始 菜单中卸载程序快捷方式的图标 我看到这个 使用 Resource Hacker 在构建后更改图标 但我无法实现它 My code Icons Name group cm
  • 在 MacOS Big Sur 上安装 Netbeans 8.2 未找到 JDK

    我最近升级到 MacOS Big Sur 当尝试打开 NetBeans 8 2 时出现错误 缺少 JDK 并且需要运行某些 NetBeans 模块 请使用 JDK home命令行选项指定JDK安装 我尝试将 JAVA HOME 设置为 JD
  • Android - 触摸通知时提示对话框窗口

    我是 Android 应用程序开发新手 我正在为我的最后一年项目申请 我的应用程序将提醒用户预约 到目前为止 我设法在预约日期的通知栏上显示警报 我的主管要求添加一个功能 当用户在通知栏上单击选项卡时 将会出现一个对话框窗口并显示详细信息
  • ifelse 的意外结果

    我得到了意想不到的结果ifelse功能 vector lt factor c x x y z levels c x y z ifelse class vector factor yes levels vector no unique vec
  • 导航到 OnNavigedTo 的另一个页面?

    为什么该方法Navigate调用时不工作导航至该页面的事件 您可以重现这种行为吗 有什么想法如何避免这个问题 void LockScreenPage OnNavigatedTo Windows UI Xaml Navigation Navi
  • 如何将 div 覆盖在框架集上?

    我需要使用 jQuery 1 6 2 为现有 jsp 页面创建一个请等待页面 我能够使 div 覆盖正常工作 并在页面中心的模式窗口中显示 请稍候 动画 然而 覆盖层仅覆盖其中一个框架集 即中心框架集 html 结构基本上是 为了清楚起见
  • 关闭 AngularJS 中的 URL 操作

    我正在尝试使用 Angular 编写我的第一个网络应用程序 在正常模式下 html5模式关闭 Angular 强制地址的哈希部分看起来像 路径 添加前导 并对特殊字符进行编码 例如 它允许单个 和 在哈希中 并用 3F 和 23 替换其他
  • 如何从Python列表中删除所有重复元素?

    我有一个这样的清单 1 2 3 4 3 5 3 6 7 8 我想从列表中完全删除重复元素 此处 3 如下所示 1 2 4 5 6 7 8 如何在 python 中实现这一点 以便不仅删除第一次出现的重复元素 而且删除所有重复值 您可以使用C
  • 使用 Data studio 修剪 BigQuery 分区

    我对这个问题有一个几乎相同的场景 如何选择BigQuery表中最新的分区 还有一个额外的并发症 我需要在 Data Studio 中显示结果 设置 我有一系列以不同时间间隔出现的数据集 我需要获取最新的分区 因为它们之间的时间段不一致 所以
  • 如何在 SQL 和关系代数中无论列顺序如何只列出每对元组一次?

    我正在做一些书本练习 但找不到有关如何用关系代数表达以下内容的解释 我确实找到了一个不过 SQL 的答案但我感兴趣的是是否有其他方法可以解决这个问题 书中的问题是 找到那些具有相同速度和 RAM 的 PC 型号对 一对只能列出一次 例如 列
  • 什么是拓扑排序

    我在网上查找了很多例子并观看了 YouTube 视频 但我仍然对拓扑排序是什么有点迷失 据我了解 您应该从已访问和未访问的队列开始 并在访问完节点的所有子节点后获取拓扑排序顺序 拓扑排序意味着你会得到一份工作列表和先决条件列表 你必须弄清楚
  • 如何获取当前日期和时间

    如何在 Java 中获取当前日期和时间 我正在寻找相当于DateTime Now来自 C 只需构建一个新的Date没有任何参数的对象 这会将当前日期和时间分配给新对象 import java util Date Date d new Dat
  • 输出 char8_t const* 到 cout 和 wcout,一编译一不

    Since P1423R1为 char8 t char16 t 和 char32 t 添加已删除的 ostream 插入器 如果我们希望将这些类型流式传输到 ostream 我们暂时会遇到需要编写自定义运算符的情况 尝试对 MSVC 201