5

このコードがコンパイルされないことを発見して、かなり驚いています (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""sfromと衝突することはできません:std::chrono

auto ten_seconds = 10s; // ten seconds
auto some_string = "some string"s; // some string

その理由は、ユーザー定義のリテラルと衝突しないことである可能性があると考えていましたが、標準では、それらの前に'_'アンダースコアを付ける必要があると述べています。

警告: 「_」が前に付いていないリテラル演算子サフィックスは、将来の標準化のために予約されています

だから、私はかなり驚いています.文字列リテラル演算子をstd::literals::string_literals?

ありがとう。

4

0 に答える 0