このコードがコンパイルされないことを発見して、かなり驚いています (C++14 コンパイラを使用していると仮定します)。
std::cout << "hello world!\n"s;
ideone が示すエラーは次のとおりです。
文字列リテラル演算子 'operator""s' が見つかりません
幸いなことに、using
ステートメントを使用して修正するのは非常に簡単です。
using namespace std::literals::string_literals;
std::cout << "hello world!\n"s; // Compiles!
std::string
標準文字列のユーザー定義リテラルをそれ自体とは異なる名前空間に配置する背後にある理由があるかどうか疑問に思っています。私はそれについて考えてきましたが、理由がわかりません。
異なる型で動作するため、 operator""s
fromと衝突することはできません:std::chrono
auto ten_seconds = 10s; // ten seconds
auto some_string = "some string"s; // some string
その理由は、ユーザー定義のリテラルと衝突しないことである可能性があると考えていましたが、標準では、それらの前に'_'
アンダースコアを付ける必要があると述べています。
警告: 「_」が前に付いていないリテラル演算子サフィックスは、将来の標準化のために予約されています
だから、私はかなり驚いています.文字列リテラル演算子をstd::literals::string_literals
?
ありがとう。