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::literals
がinline
.
それらは別々の名前空間内にあると思っていたので、互いに競合しません。しかし、彼らがそうである場合inline
、この動機は元に戻されますよね? 編集: Bjarne は、主な動機は「ライブラリのバージョン管理」であると説明していますが、これはここには当てはまりません。
「Seconds」と「String」のオーバーロードが異なるため、競合しないことがわかります。しかし、オーバーロードが同じ場合、それらは競合しますか? inline
または、 ( ?)を取ると、namespace
どういうわけかそれが妨げられますか?
したがって、それらがinline namespace
まったく存在することから何が得られるのでしょうか? @Columbo が以下で指摘しているように、インライン名前空間全体のオーバーロードはどのように解決され、衝突しますか?