23

C++ 標準 (例: N4594) には、次の 2 つの定義がありますoperator""s

1 つstd::chrono::seconds:

namespace std {
...
inline namespace literals {
inline namespace chrono_literals {
// 20.15.5.8, suffixes for duration literals
constexpr chrono::seconds operator "" s(unsigned long long);

と 1 つstd::string:

namespace std { 
....
inline namespace literals {
inline namespace string_literals {
// 21.3.5, suffix for basic_string literals:
string operator "" s(const char* str, size_t len);

それらstd::literalsinline.

それらは別々の名前空間内にあると思っていたので、互いに競合しません。しかし、彼らがそうである場合inline、この動機は元に戻されますよね? 編集: Bjarne は、主な動機は「ライブラリのバージョン管理」であると説明していますが、これはここには当てはまりません。

「Seconds」と「String」のオーバーロードが異なるため、競合しないことがわかります。しかし、オーバーロードが同じ場合、それらは競合しますか? inlineまたは、 ( ?)を取ると、namespaceどういうわけかそれが妨げられますか?

したがって、それらがinline namespaceまったく存在することから何が得られるのでしょうか? @Columbo が以下で指摘しているように、インライン名前空間全体のオーバーロードはどのように解決され、衝突しますか?

4

1 に答える 1