Kode ini tidak dikompilasi di Dentang (6,7,8,9, trunk), tetapi kompilasi saja di GCC (7.1, 8.1, 9.1):
template<class T> struct TypeHolder { using type = T; };
template<int i>
class Outer {
private:
template<class T>
static constexpr auto compute_type() {
if constexpr (i == 42) {
return TypeHolder<bool>{};
} else {
return TypeHolder<T>{};
}
}
public:
template<class T>
using TheType = typename decltype(Outer<i>::compute_type<T>())::type;
};
int main() {
Outer<42>::TheType<int> i;
}
Dentang memberitahu saya:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
... yang tentu saja itu, tapi aku mencoba mengakses anggota itu dari dalam kelas yang sama. Saya tidak mengerti mengapa itu tidak dapat diakses di sana. Sudahkah saya menekan (dan haruskah saya mengajukan) bug Dentang?
Anda dapat bermain-main dengan kode di explorer compiler Godbolt .
c++
language-lawyer
c++17
clang++
Lukas Barth
sumber
sumber
friend int main();
berhenti Dentang mengeluh.Outer<42>
, bukanmain
- bukan? Terlihat lebih seperti bug bagiku sekarang.std::result_of
pekerjaan saja?Jawaban:
Ini adalah masalah inti 1554 . Standar tidak jelas bagaimana pemeriksaan akses dilakukan untuk templat alias (dalam konteks definisi, atau dalam konteks penggunaan).
Arah saat ini adalah untuk memeriksa dalam konteks definisi, yang akan membuat kode Anda terbentuk dengan baik.
sumber