gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:34:18 27 4
gpt4 key购买 nike

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<<对于 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_tchar16_tchar32_t 相关重载。 P1423R2 包含该更改,因此当/如果实现该更改时,std::wcout 的示例代码编译也会失败。该修订尚未在邮件中发布,但可以在 https://rawgit.com/sg16-unicode/sg16/master/papers/p1423r2.html 进行预览。 .

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

关于c++ - 输出 char8_t const* 到 cout 和 wcout,一编译一不,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56613226/

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