SSS açıklama çok yanıltıcı kullanmaya başlarsanız
Ayrıca bağlayıcı hatası alıyorum; AE::c6
ve AE::c7
her ikisi de değerlerdir. AE::c7
, hiçbir tanım yoksa söz konusu kod bir tanım kuralı ihlal: aslında nesnenin adresi gerektiği derleyici eğer Uygulamada
An expression is potentially evaluated unless it is an unevaluated operand or a subexpression thereof. A variable whose name appears as a potentially-evaluated expression is odr-used unless it is an object that satisfies the requirements for appearing in a constant expression and the lvalue-to-rvalue conversion is immediately applied. [...]
[...]
Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program; no diagnostic required.
, bağlayıcı genellikle bir hata üretecektir. kasanızda, p2
daha sonra kullanılmazsa, optimizasyon p1
tanımını kaldıracağından derleyici adresine gereksinim duymaz. Hiçbir hemen lvalue-to-rvalue dönüşüm olmayacak, std::vector<>::push_back
yana
std::vector<int> v;
v.push_back(AE::c6);
bir başvuru alır ve bir tanım gerekli geçerli: Bu durumda Daha da daha sık vaka aşağıdaki gibi şeylerdir. Uygulamada, std::vector<>::push_back
bir şablon işlevidir (genellikle satır içi), bu nedenle derleyici, uygulamasının içine girebilir ve değeri gerçek değerine dönüştürür ve gerçek değerdegerçek değere dönüştürülür. Kod derlenecek ve çalışacaktır. Ama yine de resmen tanımlanmamış bir davranış.
"AE" ve "f()" sınıflarını ayrı ayrı derler ve sonra nesnelere bağlarsanız ne olur? – juanchopanza
@juanchopanza '-O2' ile derler ve' f() 'aslında bir noptur. Ancak, orijinal programın -O0 ile yaptığı gibi -O0 'ile bir bağlayıcı hatası verir. – Csq
@Csq Evet, cevabınızı gördüm ve oyladım. Alternatif olarak, std :: cout << p1 << std :: endl; 'bir op yapardı. – juanchopanza