¿Por qué std::is assignable devuelve false con tipos de puntero relacionados?


Dadas dos clases muy simples:

class X
{
};

class Y : public X
{
};

¿Por qué es eso, con Clang y GCC apuntando a C++14, std::is_assignable<X*, Y*>::value es false? Es true con Clang en mi configuración cuando me dirijo a C++11.

Author: Barry, 2015-10-01

2 answers

Esto se debe a que en su caso X* se convierte en un rvalue. No se puede asignar a un rvalue. Cambie a un lvalue en su lugar:

std::is_assignable<X*&, Y*>::value
//                  ~^~
 25
Author: Piotr Skotnicki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 17:30:11

std::is_assignable controles:

Si la expresión std::declval<T>() = std::declval<U>() está bien formada en un contexto no evaluado

Pero no se puede asignar a un rvalue (que es lo que declval<X*>() sería) en absoluto. Necesita un lvalue en el lado izquierdo de la asignación:

std::is_assignable<X*&, Y*>::value

Eso sería cierto. Si Clang está devolviendo true, definitivamente es un error de Clang.

 25
Author: Barry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 21:10:32