[英]What is the portable way to forward-declare classes in an inline namespace in libc++?
僅當我將-stdlib=libc++
指定為clang++
時,以下代碼才會編譯:
namespace std {
class mutex;
}
void f(std::mutex &x);
#include <mutex>
void f(std::mutex &x) { }
注意:通過名稱查找找到的候選人是'std :: __ 1 :: mutex'
我明白什么是::__1
那里,
但在我看來, libc++
打破了C ++標准定義的API:
應該可以轉發聲明std::mutex
因為它應該直接駐留在std
下,不應該嗎?
請注意,編譯階段而不是鏈接階段失敗。 所以我認為我的問題的答案應該是“因為libc ++使用了與GNU libstdc ++不同的ABI ......”
但在我看來,libc ++打破了C ++標准定義的API:
實際上,它沒有。 該標准在[contents]中指定:
未指定在特定名稱空間中聲明的名稱是直接在該名稱空間中聲明還是在該名稱空間內的內聯名稱空間中聲明。
libc ++允許將mutex
放在inline namespace __1
。 請注意,有充分的理由需要內聯命名空間,通常作為用戶,您甚至不關心它們是否存在。
對於您的具體問題,您仍然可以使用libc ++轉發std::mutex
...您只需要包含所有命名空間(請參閱此問題以了解如何檢測-std = libc ++):
namespace std {
#ifdef _LIBCPP_VERSION
inline namespace __1 {
struct mutex;
}
#else
struct mutex;
#endif
}
但是,從[namespace.std]:
如果C ++程序向命名空間std或命名空間std中的命名空間添加聲明或定義,則它是未定義的,除非另有說明。
前向聲明仍然是一個聲明,因此即使上面的內聯命名空間占用的版本也是未定義的行為。 所以更喜歡直接這樣做:
#include <mutex>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.