【发布时间】:2019-06-15 18:44:08
【问题描述】:
由于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 编译,除非我取消对char8_t const * 的非模板化operator<< 的注释。
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 编译是错误的?无论哪种方式,这似乎都是错误。
【问题讨论】:
-
您在寻找
language-lawyer吗? -
@RobertAndrzejuk 不确定。你觉得我需要一个吗?