Mai*_*ter 14 c++ templates overloading c++11
在C++ 11中是否有可能重载const char*和字符串文字(const char[])?我们的想法是避免在strlen已知此长度时调用以查找字符串长度.
这个片段打破了G ++ 4.8和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;
}
Run Code Online (Sandbox Code Playgroud)
错误(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.
Run Code Online (Sandbox Code Playgroud)
黑客攻击了一下,这似乎有效:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的C++ 11吗?T&&删除数组专门化时,字符串文字似乎会重载.是什么原因导致这个暧昧被解决,而不是第一个代码片段中的那个?
在第一种情况下,在重载解析期间,您将拥有一个完美的匹配条件,无需对数组进行指针到指针的转换(属于“左值转换”类别,左值到右值以及函数到指针的转换)。仅通过左值变换产生的差异不足以使重载分辨率选择获胜者。
在第二种情况下,在重载解析期间,两个函数具有完全相同的参数类型。然后部分排序是最后的选择,发现第二个模板将接受您曾经传递给它的所有参数,而第一个模板仅接受数组。因此,发现第二种情况下的第一个模板更加专业化并采用。
至于您的其他问题-不,不可能专门针对字符串文字进行重载。您总是会和它们一起捕获相同大小的数组。
| 归档时间: |
|
| 查看次数: |
1386 次 |
| 最近记录: |