Karena templat didefinisikan di dalam tajuk dan kompilator dapat menentukan apakah sebaris fungsi menguntungkan, apakah masuk akal? Saya pernah mendengar bahwa kompiler modern tahu lebih baik kapan harus menyebariskan suatu fungsi dan mengabaikan inline
petunjuk.
edit: Saya ingin menerima kedua jawaban tersebut, tetapi ini tidak mungkin. Untuk menutup masalah ini saya menerima jawaban phresnel , karena mendapat suara terbanyak dan dia secara resmi benar, tetapi seperti yang saya sebutkan di komentar, saya menganggap Puppy 's dan Komponen 10 jawaban sebagai jawaban yang benar juga, dari sudut pandang yang berbeda .
Masalahnya ada di semantik C ++, yang tidak ketat dalam hal inline
kata kunci dan sebaris. phresnel mengatakan "tulis sebaris jika Anda bersungguh-sungguh", tetapi apa yang sebenarnya dimaksud inline
tidak jelas karena ia berevolusi dari makna aslinya menjadi petunjuk yang "menghentikan penyusun mengomel tentang pelanggaran ODR" seperti yang dikatakan Puppy .
inline
hanya karena templat yang dikhususkan ditandai denganinline
. Jadiinline
pada template sama sekali tidak relevan. Apakah fungsi itu harus adainline
atau tidak, tidak ada hubungannya dengan itu yang dihasilkan melalui spesialisasi template (dan ada jawaban yang lebih baik daripada alamat ini ketika digunakaninline
). Jawaban @Puppy di bawah ini benar, yang ini salah. Menambahkaninline
template tidak relevan, danclang-tidy
sebenarnya akan menghapusnya.inline
tidak tidak relevan, misalnya harus mencakup kasus eksplisit mengkhususkan diritemplate<> void f<>(int) {}
tanpa ituinline
kata kunci. Tetapi bahkan kemudian mengubahinline
penentu pada templat tidak membuat perbedaan apa pun, karena apakah Anda menandai templatinline
atau tidak tidak relevan.Itu tidak relevan. Semua template sudah ada
inline
- belum lagi pada tahun 2012, satu-satunya penggunaaninline
kata kunci tersebut adalah untuk menghentikan penyusun yang mengeluh tentang pelanggaran ODR. Anda benar-benar benar- kompilator generasi sekarang Anda akan tahu apa yang harus disisipkan sendiri dan mungkin dapat melakukannya bahkan di antara unit terjemahan.sumber
inline
fungsi yang ditandai (yaitu, beberapa definisi yang setara dapat diteruskan ke linker, yang akan memilih salah satu). Itu, bukan sebaris, adalah fungsi sebenarnya dariinline
kata kunci.inline
. Mungkin bisa mengintip jawaban saya di bawah (atau di atas, tergantung penyortiran yang dipilih). Untuk templat yang tidak terspesialisasi, Anda tentu saja benar, tetapi secara formal tidak sama.inline
apa yang seharusnya sebaris. Biasanya tidak ada bedanya, tetapi dalam bahasa standar, mereka tidak sama, dan tidak semuanya sejajar. Saya menerima pendapat Anda tentang hal itu dengan mengatakan "Ini tidak relevan", tetapi menurut standar, tidak semua template berada dalam baris, hanya untuk Anda sebagai pengguna C ++ - template tersebut tampak seolah-olah.Seperti yang Anda sarankan,
inline
ini adalah petunjuk untuk kompiler dan tidak lebih. Ia dapat memilih untuk mengabaikannya atau, memang, fungsi sebaris tidak ditandai sebaris.Menggunakan
inline
with template dulunya merupakan cara (buruk) untuk mengatasi masalah bahwa setiap unit kompilasi akan membuat objek terpisah untuk kelas template yang sama yang kemudian akan menyebabkan masalah duplikasi pada waktu penautan. Dengan menggunakaninline
(saya pikir) nama mangling berhasil berbeda yang membuat nama bentrok pada waktu tautan tetapi dengan mengorbankan kode yang sangat membengkak.Marshall Cline menjelaskan di sini lebih baik dari yang saya bisa.
sumber
§14.5.5.1 p7 & p8
). Saya buruk, saya menghapus komentar yang salah.