ybu*_*ill 10 c++ clang string-literals overload-resolution c++11
编译以下代码
void f(char *, const char *, ...) {}
void f(const char *, ...) {}
int main()
{
f("a", "b");
}
Run Code Online (Sandbox Code Playgroud)
与clang给了我这个错误:
prog.cpp:6:2: error: call to 'f' is ambiguous
f("a", "b");
^
prog.cpp:1:6: note: candidate function
void f(char *, const char *, ...) {}
^
prog.cpp:2:6: note: candidate function
void f(const char *, ...) {}
^
Run Code Online (Sandbox Code Playgroud)
AFAIK字符串文字在C++中是常量,因此重载规则应该从考虑中删除第一个变体,从而明确地解析为第二个变体.但我认为Clang因兼容性原因而使它们成为非const(我知道MSVC也这样做).
用什么编译器标志来解决这个问题?我已经在编译了-std=c++11
.
编辑:显式演员来const char*
解决这个问题:
f((const char*)"a", "b");
Run Code Online (Sandbox Code Playgroud)
但是,如果我认为观察到的编译器行为不是标准的,我想修复编译器行为而不是标准符合代码.
我认为这是一个错误.char *
在C++ 11中删除了字符串文字的转换,我不知道在涉及它的转换序列的重载解析中有任何规定.
作为一种不涉及更改每次调用的变通方法f
,您可以通过引用捕获数组来编写另一个使用字符串文字显式捕获每个调用的重载:
template<size_t N, typename ...F>
void f(char const (&a)[N], F&&... args)
{
f((char const *)a, std::forward<F>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
536 次 |
最近记录: |