Son yayınlanan bir cevabın, What other useful casts can be used in C++ hakkındaki birkaç yorum, C++ dönüşümleri anlayışımın hatalı olduğunu ortaya koymaktadır.C++ örtük dönüşümler
#include <string>
struct A {
A(const std::string & s) {}
};
void func(const A & a) {
}
int main() {
func("one"); // error
func(A("two")); // ok
func(std::string("three")); // ok
}
Benim iddiası bir dönüşüm elde var bir A'ya bir const char * dan dönüşüm yaşanmaz becauuse ilk işlev çağrısı bir hata olduğunu idi: Sadece konuyu netleştirmek için, aşağıdaki kodu dikkate Bir A'ya bir dize, ancak bunu kullanarak birden fazla dönüşüm içerebilir. Benim anlayışım buna izin verilmiyor ve bu g ++ 4.4.0 & Comeau derleyiciler tarafından onaylanmış gibi görünüyor. Comeau ile aşağıdaki hatayı alıyorum: Yanlış nerede olduğumu tercihen C++ Standard atfen, ya burada ya da orijinal cevap, işaret Eğer
"ComeauTest.c", line 11: error: no suitable constructor exists
to convert from "const char [4]" to "A"
func("one"); // error
, lütfen bunu.
Ve C++ standardından cevap gibi görünüyor: Abhay için
At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
Teşekkür alıntı sağlamak için.
Üzgünüm, cevabınıza yapılan yorumlarda yanılmışım. "Aşırı yükleme çözünürlüğü, çağrılacak kullanıcı tanımlı dönüştürmeyi seçmek için kullanılır." Dedim ve kendime 'iyi' dedim, sonra A (string const &) 'a ve "one"' a geçecek, ama tamamen başarısız oldum 13.3.3.1.2'nin ne dediğini düşünmek için: "Kullanıcı tanımlı bir dönüşüm dizisi, bir standart standart dönüşüm dizisinden ve bir kullanıcı tanımlı dönüştürme (12.3) ve ardından ikinci bir standart dönüşüm dizisinden oluşur." Ancak "bir" -> dizgesi standart bir dönüşüm dizisi olmayacak, ancak başka bir kullanıcı tanımlı dönüşüm dizisi gerektirecektir! –
Mermerlerimi kaybetmediğim sürece sadece… –
Harika soru! Tartışma, “std :: string” inin dilin bir parçası olmadığını ve “kullanıcı tanımlı” olduğu/dönüştürüldüğünü ima eder. En azından bu benim anlayışım, eğer yanılıyorsam beni düzeltin. Sorunun daha açık olması güzel olurdu. Std :: string'in tam durumu, eski C++ ellerine kristal berraklığında olabilir, ancak bu yüzyılda dile gelen insanlar için fark etmek kolay değildir. –