Ada situasi di mana saya ingin mengumpulkan semua nama node jalur ke kunci di JSON. Pertimbangkan kondisi indeks array "0", "1" juga diperbolehkan, tetapi mudah untuk melupakan tanda kutip, yang akan menyebabkan crash ketika melakukan dereference. Jadi saya ingin menolak ini. Contoh:
#include <vector>
#include <iostream>
int func(const std::vector<const char*>& pin) {
return pin.size();
}
int main() {
// {"aname", "3", "path", "0"} wanted but this still compile
std::cout << func({"aname", "3", "path", 0}) << std::endl;
}
Saya menemukan dan mencoba ini. Bagaimana cara menghindari konversi tersirat pada fungsi yang tidak membangun? sebagai berikut:
#include <vector>
#include <iostream>
int func(const std::vector<const char*>& pin) {
return pin.size();
}
template<typename T>
int func(T pin) = delete;
int main() {
std::cout << func({"aname", "3", "path", 0}) << std::endl;
}
Tetapi kompiler masih tidak mengerti saya.
Ada saran?
Tolong tunjukkan penyalahgunaan terminologi dan asumsi, terima kasih!
std::vector<const char*>
bukanstd::vector<std::string>>
?nullptr
juga?Jawaban:
Sesuatu seperti ini? Ini sangat mirip dengan solusi kelebihan yang Anda sarankan, tetapi membutuhkan pembungkus jenis vektor. Gagal membangun jika Anda memberikan literal
0
karena kelebihan konstruktor yang dihapus dipilih.sumber
Di belakang, banyak konversi implisit dalam C ++ sangat disayangkan, ini menjadi salah satunya.
Satu opsi untuk dipertimbangkan adalah
-Wzero-as-null-pointer-constant
pada gcc dan dentang. Hati-hati karena ini mengubah perilaku program standar dan jika diaktifkan secara global dapat memiliki beberapa efek yang tidak diinginkan.g ++ - bagaimana cara menonaktifkan konversi implisit dari 0 ke tipe pointer?
Peringatan Dentang manakah yang setara dengan Wzero-as-null-pointer-constant dari GCC?
sumber
Saya suka jawaban Mikel Rychliski . Namun sudah ada solusi di Perpustakaan Dukungan Pedoman :
gsl::not_null
Saya sangat merekomendasikan GSL. Ini dibuat dan didukung oleh banyak pakar C ++, Bjarne Stroustrup sendiri dan Herb Sutter di antara mereka. Dan Panduan Inti C ++ secara aktif diintegrasikan ke dalam peringatan kompiler dan analisis statis.
sumber