#include <iostream>
template<typename... T>
void foo(const T &...);
template<unsigned N>
void foo(const char (&)[N])
{
std::cout << "char(&)[N]" << std::endl;
}
void foo(const char *)
{
std::cout << "const char *" << std::endl;
}
template<typename T>
void foo(const T &)
{
std::cout << "Single" << std::endl;
}
template<typename First, typename... T>
void foo(const First & first, const T &... rest)
{
std::cout << "Generic + " << sizeof...(T) << std::endl;
foo(first);
foo(rest...);
}
int main()
{
const char * c = "asdf";
char a[] = {'a', 'b', 'c', 'd'};
foo('f', c, a, 1);
foo(a);
}
Generic + 3
Single // fine; 'f' is `char` -> generic
Generic + 2
const char * // fine; c is `const char *`
Generic + 1
const char * // (!) not fine
Single
char(&)[N] // fine; a is char[4]
आखिरी कॉल - foo(a)
, जहां a
char[4]
है - संस्करण मैं कॉल उम्मीद - template<unsigned N> void foo(const char (&)[N])
। लेकिन foo
के चरणीय टेम्पलेट का तात्कालिकता क्यों नहीं है foo(const char (&)[N]
पर कॉल करें, लेकिन इसके बजाय foo(const char *)
पर कॉल करें? यदि कोई चार सरणी अधिभार नहीं था, तो इसकी अपेक्षा की जानी चाहिए - लेकिन यह क्यों हो रहा है? const First &
कैप्चर सरणी प्रकार ठीक से नहीं होना चाहिए?
इसके अलावा, जेनेरिक वैरिएड संस्करण को पारित किए गए सरणी के साथ ठीक तरह से काम करने का सबसे आसान तरीका क्या होगा? माथीउ एम
के रूप में टिप्पणी में देखा यह समस्या शायद variadic टेम्पलेट्स के कारण नहीं है, लेकिन indirection द्वारा:
#include <iostream>
template <unsigned N>
void foo(const char (&)[N])
{
std::cout << "char(&)[N]" << std::endl;
}
void foo(const char *)
{
std::cout << "const char *" << std::endl;
}
template <typename T>
void goo(T const& t) {
foo(t);
}
int main()
{
char a[] = {'a', 'b', 'c', 'd'};
foo(a);
goo(a);
}
char(&)[N] const char *
उन्होंने यह भी कहा है कि यह संकलक हो सकता है बग - हालांकि कोड क्लेंग 3.2 देव, जी ++ 4.6 और 4.7 दोनों में बिल्कुल वही परिणाम उत्पन्न करता है।
आर Martinho फर्नांडीस ने कहा कि const char a[]
करने के लिए पिछले टुकड़ा में बदल रहा है a
के प्रकार कोड उपज const char *
बनाता है दो बार।
क्यों '// ठीक है; "afas" const const * 'है? यह नहीं! http://ideone.com/4KewDe –
@ आर। मार्टिन्हो फर्नांडीस, तय। – Griwes
मैंने समस्या को और कम करने में कामयाब रहे [यहां] (http://liveworkspace.org/code/72b3963b4f0c2d00592b4ce00f08fc82)। स्पष्ट रूप से संकेत इस मुद्दे का कारण बन रहा है और इसके साथ भिन्नता का कोई लेना-देना नहीं है। फिर भी एक संभावित स्पष्टीकरण नहीं मिला है ... यह निश्चित रूप से मेरे लिए एक कंपाइलर बग की तरह दिखता है। –