Рассмотрим следующую программу:
#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 С++ 2010 SP1
- (3) вызывается при компиляции программы с помощью Clang 3.0 (соединительная линия 127530)
Знают ли правила разрешения перегрузки существенно в разных черновиках С++ 0x? Или, два из этих компиляторов действительно просто полностью ошибаются? Какая перегрузка - это правильная перегрузка, которая должна быть выбрана за последний проект С++ 0x?