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(使用前将#替换为@)