Почему decltype (* this) не возвращает правильный тип?

Следующий код был скомпилирован с VC ++ ноябрь 2012 CTP. Но компилятор дал предупреждение.

Мне просто интересно, является ли это ошибкой VC ++ ноябрь 2012 CTP.

struct A
{
int n;

A(int n)
: n(n)
{}

int Get() const
{
return n;
}

int Get()
{
//
// If using "static_cast<const A&>(*this).Get();" instead, then OK.
//
return static_cast<const decltype(*this)&>(*this).Get(); // Warning!
}
};

int main()
{
A a(8);

//
// warning C4717: 'A::Get' : recursive on all control paths,
// function will cause runtime stack overflow
//
a.Get();
}

8

Решение

decltype применяется к выражению, которое не является id-выражением, дает вам ссылку, поэтому decltype(*this) уже A&и ты не можешь сделать это const снова. Если вы действительно хотели использовать decltypeВы могли бы сделать что-то вроде этого:

static_cast<std::decay<decltype(*this)>::type const &>(*this)

Или даже это:

static_cast<std::add_lvalue_reference<
std::add_const<
std::decay<decltype(*this)>::type
>::type
>::type
>(*this)

Конечно, гораздо проще сказать static_cast<A const &>(*this),

17

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector