क्या सी ++ 11 में const char*
और स्ट्रिंग अक्षर (const char[]
) अधिभारित करना संभव है? यह विचार स्ट्रिंग लंबाई खोजने के लिए strlen
पर कॉल करने से बचने के लिए है जब यह लंबाई पहले से ज्ञात है।कानूनी रूप से स्ट्रिंग अक्षर और कॉन्स चार * को अधिभारित करना संभव है?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
template<typename T, int N>
void length(const T(&data)[N]) {
printf("%u[]\n", N - 1);
}
template<typename T>
void length(const T* data) {
printf("*%u\n", (unsigned)strlen(data));
}
int main() {
length("hello");
const char* p = "hello";
length(p);
return 0;
}
त्रुटि (बजना):
जी ++ 4.8 और बजना ++ 3.2 परयह टुकड़ा टूट
test2.cpp:16:3: error: call to 'length' is ambiguous
length("hello");
^~~~~~
test2.cpp:6:6: note: candidate function [with T = char, N = 6]
void length(const T(&data)[N]) {
^
test2.cpp:11:6: note: candidate function [with T = char]
void length(const T* data) {
^
1 error generated.
थोड़ा हैक कर लिया गया है, और इस काम करने के लिए प्रकट होता है:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
template<typename T, int N>
void length(const T(&data)[N]) {
printf("%u[]\n", N - 1);
}
template<typename T>
void length(T&& data) {
printf("*%u\n", (unsigned)strlen(data));
}
const char *foo() {
return "bar";
}
int main() {
length("hello");
const char* p = "hello";
length(p);
length(foo());
return 0;
}
क्या यह मान्य सी ++ 11 है? सरणी विशेषज्ञता हटा दिए जाने पर स्ट्रिंग अक्षर T&&
पर ओवरलोड पर प्रतीत होता है। इस अस्पष्टता को हल करने का क्या कारण बनता है, लेकिन पहले कोड स्निपेट में से कोई नहीं?
अजीब, मुझे [अलग व्यवहार] (http://ideone.com/3vrQkG) मिलता है, और यह इस बात पर निर्भर करता है कि 'char' टेम्पलेट तर्क है या नहीं ... –
[यह] (http: // stackoverflow .com/a/11625621/845568) उत्तर में क्या हो रहा है इसके बारे में कुछ प्रासंगिक जानकारी है ... –
@KerrekSB: यह स्पष्ट रूप से असहज है :( –