E 'possibile in C++ 11 sovraccaricare const char*
e stringhe letterali (const char[]
)? L'idea è di evitare di chiamare strlen
per trovare la lunghezza della stringa quando questa lunghezza è già nota.È possibile sovraccaricare legalmente una stringa letterale e const char *?
questo frammento di G ++ 4.8 e Clang ++ 3.2:
#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;
}
Error (Clang):
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.
Hacked un po ', e questo sembra funzionare:
#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;
}
È questo C++ 11 valido? La stringa letterale sembra sovraccaricare su T&&
quando viene rimossa la specializzazione dell'array. Che cosa causa questa ambiguità da risolvere, ma non quella del primo frammento di codice?
Strano, ho [comportamento diverso] (http://ideone.com/3vrQkG), e dipende dal fatto che 'char' sia un argomento modello o no ... –
[Questo] (http: // stackoverflow .com/a/11625621/845568) risposta ha alcune informazioni rilevanti su cosa sta succedendo ... –
@KerrekSB: Questo è francamente scomodo :( –