2017-07-25 23 views
14

Şimdi yazdığım bazı kodlarda beklenmeyen bir sorunla karşılaşıyorum ve hangi derleyicinin doğru olduğundan emin değilim. C++ açık çoklu arg kurucu belirsizlik

Biz const char*, const char* süren çok argüman yapıcı var ama açık ilan edilir:

constexpr explicit Wrapper(const char* a, const char* b) : pair(a,b){} 

Sonra Wrapper alır bir işlevi ve std::pair<const char*, const char*>

void q(Wrapper w); 
void q(std::pair<const char *, const char *> w); 
alır bir aşırı yüklenme

Ve daha sonra ikinci bir aşırı yükü çağırmayı umduğum kodumuz var:

q({"a", "b"}); 

Bu, clang numaralı telefondan derlenmiştir, ancak hem GCC hem de MSVC'de derlenememektedir. Standartta açık çok argümanlı kurucudan bahsetmeye çalışıyorum ve bu belirsizlikten söz eden bir şey varsa, ancak ilgili metni bulamadım. Sadece hangi davranışın doğru olduğunu ve hangi sorunun olduğunu merak ediyorum.

Godbolt linki: Wrapper için sağlanan yapıcı kullanılması https://godbolt.org/g/2aYUov

+5

Sanırım “açık”, iki argüman alan bir kurucu değil, bir çift argüman alan bir kurucu olmadığı için burada sayılmaz. – nefas

+3

@nefas bu diğer stackoverflow gönderimine göre (https://stackoverflow.com/questions/1118680/explicit-keyword-on-multi-arg-constructor?rq=1) C++ 11 ve sonra – Morten242

+0

@ olarak sayılmalıdır Morten242 Bunu bilmiyordum. Yani kod derlenmeli mi? – nefas

cevap

2

, g ++ 7.1.1 bana aşağıdaki hatayı veriyor:

main.cpp: In function ‘int main()’: 
main.cpp:29:25: error: converting to ‘Wrapper’ from initializer list would use explicit constructor ‘constexpr Wrapper::Wrapper(const char*, const char*)’ 
    Wrapper w({"a", "b"}); 
         ^

yüzden Sarıcı yapıcı açık anahtar kelime iyi alınır gibi görünüyor Bir dönüşümü manuel olarak tetiklerken göz önünde bulundurun.

Ancak q çağrısı hata olduğunu aşırı yük çözünürlüğü açık anahtar kelime görmezden işaret gibi görünüyor:

main.cpp:34:17: error: call of overloaded ‘q(<brace-enclosed initializer list>)’ is ambiguous 
    q({"a", "b"}); 
       ^
main.cpp:16:6: note: candidate: void q(Wrapper) 
void q(Wrapper w) 
    ^
main.cpp:21:6: note: candidate: void q(std::pair<const char*, const char*>) 
void q(std::pair<const char *, const char *> w) 
    ^

Bu diğer kaynaklarla doğrulanması gerekir ++ g bir hata, olabilir.