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