de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 Sarien
Sarien
Question

Apa artinya "ODR-gunakan" sesuatu?

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?

79 2013-10-28T08:58:46+00:00 2
James Hugard
James Hugard
Pertanyaan edit 11 Desember 2017 в 10:13
Pemrograman
c++
templates
one-definition-rule
Solution / Answer
James Kanze
James Kanze
28 Oktober 2013 в 9:31
2013-10-28T09:31:59+00:00
Lebih
Sumber
Sunting
#22639966

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.

 rustyx
rustyx
Jawaban edit 14 Agustus 2016 в 12:51
64
0
 zhaorufei
zhaorufei
8 Agustus 2017 в 12:58
2017-08-08T00:58:20+00:00
Lebih
Sumber
Sunting
#22639967

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'

17
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
UbiBot UK
Terdaftar 14 jam yang lalu
2
Галина Утяшова
Terdaftar 1 hari yang lalu
3
Asilbek Qadamboyev
Terdaftar 4 hari yang lalu
4
Akshit Mehta
Terdaftar 1 minggu yang lalu
5
me you
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi