Apa logika di balik kata kunci "menggunakan" di C ++?
Ini digunakan dalam situasi yang berbeda dan saya mencoba untuk menemukan apakah semua itu memiliki kesamaan dan ada alasan mengapa kata kunci "menggunakan" digunakan seperti itu.
using namespace std; // to import namespace in the current namespace
using T = int; // type alias
using SuperClass::X; // using super class methods in derived class
int class;
. Akan lebih buruk lagi jika kode C ++ tiba-tiba berhenti menjadi C ++ yang valid.int class;
tidak akan dikompilasi sebagai C ++ tidak sepenuhnya buruk. Ini dapat digunakan untuk menjamin bahwa kode C akan dikompilasi sebagai C. Terlalu mudah untuk melupakan bahwa C dan C ++ adalah dua bahasa yang berbeda - dan, secara praktis, ada kode yang valid C dan C ++ yang valid, tetapi dengan semantik yang berbeda.using
tidak lebih buruk (atau lebih baik) daristatic
. IMHO intinya tidak memperkenalkan kata kunci baru sangat penting karena dijelaskan oleh internet terbuat dari catz dan Ben Voigt.Jawaban:
Di C ++ 11,
using
kata kunci saat digunakan untuktype alias
identik dengantypedef
.7.1.3.2
Bjarne Stroustrup memberikan contoh praktis:
typedef void (*PFD)(double); // C style typedef to make `PFD` a pointer to a function returning void and accepting double using PF = void (*)(double); // `using`-based equivalent of the typedef above using P = [](double)->void; // using plus suffix return type, syntax error using P = auto(double)->void // Fixed thanks to DyP
Sebelum C ++ 11,
using
kata kunci dapat membawa fungsi anggota ke dalam cakupan. Di C ++ 11, Anda sekarang dapat melakukan ini untuk konstruktor (contoh Bjarne Stroustrup lainnya):class Derived : public Base { public: using Base::f; // lift Base's f into Derived's scope -- works in C++98 void f(char); // provide a new f void f(int); // prefer this f to Base::f(int) using Base::Base; // lift Base constructors Derived's scope -- C++11 only Derived(char); // provide a new constructor Derived(int); // prefer this constructor to Base::Base(int) // ... };
Ben Voight memberikan alasan yang cukup bagus di balik alasan tidak memperkenalkan kata kunci baru atau sintaks baru. Standar ingin menghindari kerusakan kode lama sebanyak mungkin. Inilah sebabnya mengapa dalam dokumen usulan Anda akan melihat bagian seperti
Impact on the Standard
,Design decisions
, dan bagaimana mereka dapat mempengaruhi kode yang lebih tua. Ada situasi ketika sebuah proposal tampak seperti ide yang sangat bagus tetapi mungkin tidak memiliki daya tarik karena akan terlalu sulit untuk diterapkan, terlalu membingungkan, atau akan bertentangan dengan kode lama.Ini adalah kertas tua dari tahun 2003 n1449 . Alasannya tampaknya terkait dengan template. Peringatan: mungkin ada kesalahan ketik karena menyalin dari PDF.
Makalah tindak lanjut n1489 menjelaskan mengapa
using
alih - alih menggunakantypedef
:Saya pikir perbedaan penting dibuat di sini, alias es alih-alih tipe s. Kutipan lain dari dokumen yang sama:
Ringkasan, untuk peran
using
:namespace PO = boost::program_options
danusing PO = ...
setara)A typedef declaration can be viewed as a special case of non-template alias-declaration
. Ini adalah perubahan estetika, dan dianggap identik dalam kasus ini.namespace std
ke dalam lingkup global), fungsi anggota, mewarisi konstruktorIni tidak dapat digunakan untuk:
int i; using r = i; // compile-error
Sebaliknya lakukan:
using r = decltype(i);
Memberi nama sekumpulan kelebihan beban.
// bring cos into scope using std::cos; // invalid syntax using std::cos(double); // not allowed, instead use Bjarne Stroustrup function pointer alias example using test = std::cos(double);
sumber
using P = [](double)->void;
adalah, AFAIK, bukan C ++ 11 yang valid. Namun ini adalah:using P = auto(double)->void;
dan menghasilkan tipe fungsi (seperti ituP*
adalah penunjuk fungsi).register
tidak akan terdengar seburuk itu, ada di:register X as Y
register
memulai deklarasi variabel jadi ini sudah memiliki arti. Deklarasikan variabel register yang disebut Y tipe X.