Ini hanya datang dalam konteks pertanyaan lain.
Rupanya fungsi anggota di kelas template yang hanya diturunkan jika mereka ODR-digunakan. Bisa tolong jelaskan apa yang sebenarnya yang berarti. The artikel wikipedia pada salah Satu Definisi Aturan (ODR) doesn't menyebutkan "ODR-menggunakan".
Namun standar yang mendefinisikan sebagai
variabel yang namanya muncul sebagai berpotensi-ekspresi dievaluasi adalah odr-digunakan kecuali itu adalah objek yang memenuhi persyaratan untuk muncul dalam ekspresi konstan (5.19) dan lvalue-untuk-rvalue konversi (4.1) segera diterapkan.
di [dasar.def.odr].
Edit: Ternyata ini adalah bagian yang salah dan seluruh ayat yang mengandung beberapa definisi untuk hal-hal yang berbeda. Ini mungkin relevan untuk kelas template anggota fungsi:
non-kelebihan beban fungsi yang namanya muncul sebagai berpotensi dievaluasi ekspresi atau anggota dari himpunan kandidat fungsi, jika dipilih oleh overload resolusi ketika dirujuk dari berpotensi dievaluasi ekspresi, adalah odr-digunakan, kecuali itu adalah murni fungsi virtual dan namanya tidak secara eksplisit berkualitas.
Namun saya tidak mengerti, bagaimana aturan ini bekerja di beberapa satuan kompilasi? Semua fungsi anggota diturunkan jika aku secara eksplisit instantiate class template?
It's hanya sebuah definisi sewenang-wenang, yang digunakan oleh standar untuk menentukan kapan anda harus memberikan definisi untuk entitas (sebagai bukan hanya deklarasi). Standar doesn't mengatakan hanya "digunakan", karena hal ini dapat ditafsirkan beragam tergantung pada konteks. Dan beberapa ODR-menggunakan doesn't benar-benar sesuai dengan apa yang biasanya akan mengasosiasikan dengan "gunakan"; misalnya, virtual fungsi selalu ODR-digunakan kecuali jika itu adalah murni, bahkan jika isn't sebenarnya yang disebut di mana saja dalam program.
Definisi lengkap di §3.2, paragraf kedua, meskipun ini berisi referensi ke bagian lain untuk menyelesaikan definisi.
Berkaitan dengan template, ODR-digunakan hanya bagian dari pertanyaan;
bagian lainnya adalah instansiasi. Secara khusus, §14.7 meliputi
ketika sebuah template contoh. Tapi dua yang terkait: sementara
teks dalam §14.7.1 (implisit instansiasi) cukup lama,
prinsip dasar adalah bahwa template hanya akan diturunkan jika
hal ini digunakan, dan dalam konteks ini, digunakan sarana ODR-digunakan. Dengan demikian,
fungsi anggota dari kelas template hanya akan diturunkan
jika hal itu disebut, atau jika itu adalah virtual dan kelas itu sendiri adalah
instantiated. Standar itu sendiri penting di dalam banyak
tempat: std::daftar<>::semacam
menggunakan <
pada individu
unsur-unsur, tetapi anda dapat instantiate sebuah daftar lebih dari satu jenis elemen
yang doesn't dukungan <
, asalkan anda don't call semacam
pada
itu.
Di depan kata, odr-digunakan berarti sesuatu(variabel atau fungsi) digunakan dalam konteks di mana definisi ini harus hadir.
misalnya,
struct F {
static const int g_x = 2;
};
int g_x_plus_1 = F::g_x + 1; // in this context, only the value of g_x is needed.
// so it's OK without the definition of g_x
vector<int> vi;
vi.push_back( F::g_x ); // Error, this is odr-used, push_back(const int & t) expect
// a const lvalue, so it's definition must be present
Catatan, di atas push_back berlalu di MSVC 2013, perilaku ini tidak standar kepatuhan, baik gcc 4.8.2 dan dentang 3.8.0 gagal, pesan kesalahan ini: undefined referensi untuk `K::g_x'