Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将char8_t const*输出到cout和wcout,一个编译一个_C++_C++20 - Fatal编程技术网

C++ 将char8_t const*输出到cout和wcout,一个编译一个

C++ 将char8_t const*输出到cout和wcout,一个编译一个,c++,c++20,C++,C++20,由于为char8_t、char16_t和char32_t添加了已删除的ostream插入器,因此如果我们希望将这些类型流式传输到ostream,我们暂时处于需要编写自定义运算符的情况。尝试为MSVC 2019 16.2.0预览版2.0执行此操作时 #include <iostream> #include <string> using namespace std::literals; template<typename Tostream> Tostream&

由于为char8_t、char16_t和char32_t添加了已删除的ostream插入器,因此如果我们希望将这些类型流式传输到ostream,我们暂时处于需要编写自定义运算符的情况。尝试为MSVC 2019 16.2.0预览版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";
}

所以问题是,在哪种情况下是正确的?不为cout编译是对的还是为wcout编译是错的?无论哪种方式,这似乎都是错误。

非模板函数在重载解析方面总是优先于模板函数。因此,std::operator非模板函数在重载解析中总是优先于模板函数。因此,虽然std::operatorP1423确实通过了Kona的LEWG审查,但它还没有被C++20接受,所以有趣的是,微软已经实现了它的一部分

显示的行为与P1423R1中指定的行为匹配。在最近的LWG审查期间,要求也删除宽流中与char8\u t、char16\u t和char32\u t相关的重载。P1423R2包含了该更改,所以在实现std::wcout时,示例代码的编译也将失败。该修订版尚未在邮件中发布,但可以在网站上预览


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

P1423尚未被C++20接受,尽管它确实通过了科纳的LEWG审查,所以有趣的是,微软已经实现了其中的一部分

显示的行为与P1423R1中指定的行为匹配。在最近的LWG审查期间,要求也删除宽流中与char8\u t、char16\u t和char32\u t相关的重载。P1423R2包含了该更改,所以在实现std::wcout时,示例代码的编译也将失败。该修订版尚未在邮件中发布,但可以在网站上预览


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

你在找语言律师吗?@RobertAndrzejuk不确定。你认为我需要一个吗?你在找语言律师吗?@RobertAndrzejuk不确定。你认为我需要一个吗?是的,我明白,非模板版本会赢,但模板版本怎么样,为什么它在一种情况下足够,而在另一种情况下不足够?我的目标是使用转换,因为windows控制台通常期望拉丁语-1和强制转换是不够的。@Thomas:谁知道?也许他们没有删除另一个?也许他们的wchar\u t版本是模板化的。关键是你正在做的事情不应该起作用。好吧,那么什么应该起作用呢?我是否需要为所有unicode字符类型char8\u t、…、char32\u t和所有字符串视图类型编写非模板版本?是的,显然只有基本的char8\u t和const char8\u t*版本被删除。是的,我知道非模板版本获胜,但模板版本呢,为什么在一种情况下它就足够了,而在另一种情况下它就不够了?我的目标是使用转换,因为windows控制台通常期望拉丁语-1和强制转换是不够的。@Thomas:谁知道呢?也许他们没有删除另一个?也许他们的wchar\u t版本是模板化的。关键是你正在做的事情不应该起作用。好吧,那么什么应该起作用呢?我是否需要为所有unicode字符类型char8\u t、…、char32\u t和所有字符串视图类型编写非模板版本?是的,显然只有基本的char8\u t和const char8\u t*版本被删除。
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
std::cout << reinterpret_cast<const char*>(u8"utf-8");