Поскольку P1423R1 добавляет удаленные вставки ostream для char8_t, char16_t и char32_t, мы на мгновение остаемся в ситуации, когда нам нужно написать пользовательские операторы, если мы хотим передать эти типы в ostreams.При попытке сделать это для 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
?В любом случае это кажется ошибкой.