5
我已經簡化的代碼版本:繼承與is_detected_v提供了一種奇怪的結果(C++ 17)
#include <experimental/type_traits>
template<class T> using has_data_t = decltype(T::data());
template <class B> constexpr auto get_data() {
return std::experimental::is_detected_v<has_data_t, B>;
}
template <typename Topt> struct opt_base {
static constexpr bool i = get_data<Topt>();
//static constexpr auto j = get_data<Topt>(); // fail to compile
};
struct opt : public opt_base<opt> {
static int data() { return 7;}
};
int main() {
static_assert(std::experimental::is_detected_v<has_data_t, opt>);
}
此代碼編譯。但是,如果您將取消註釋註釋行,則斷言失敗。它使用GCC 7.1和Clang 4.0.0進行測試。編譯參數:-std = C++ 1z -O3 -Wall。 Demo
這裏什麼名字是不依賴的? –
@ T.C Hm。這些註釋中的例子都不適用於這裏,還是完全是錯誤的文本?很確定這個例子出於某種原因是不合格的ndr。 – Barry
我認爲[\ [temp.point \]/8](http://eel.is/c++draft/temp.point#8)更相關。 – cpplearner