考虑以下程序:
#include <cstddef>
#include <cstdio>
void f(char const*&&) { std::puts("char const*&&"); } // (1)
void f(char const* const&) { std::puts("char const* const&"); } // (2)
template <std::size_t N>
void f(char const (&)[N]) { std::puts("char const(&)[N]"); } // (3)
int main()
{
const char data[] = "a";
f(data);
}
f
应该叫哪个?为什么?
三个编译器的最新发布版本不同意这个问题的答案:
- (1)使用g++ 4.5.2编译程序时调用
- (2)在使用Visual C++ 2010 SP1编译程序时调用
- (3)使用Clang 3.0 (trunk 127530)编译程序时调用
重载解决规则在不同的 C++0x 草案中是否发生了重大变化?或者,这些编译器中的两个真的完全错误吗?根据最新的 C++0x 草案,哪个重载是正确的重载?