Friend declaration doesn't apply to partial specializations in icc v.13.0.089

Friend declaration doesn't apply to partial specializations in icc v.13.0.089

If someone has access to some more official bug reporting mechanism, I'd appreciate if you filed a bug report about this: (using Intel C++ Composer XE 2013 [v.13.0.089] on Windows)

#include <type_traits>

template <typename T, int guid, typename Enable = void>
struct has_type_guid
    : std::false_type
{};

template <typename T, int guid>
struct has_type_guid< T, guid, typename std::enable_if<T::_type_guid == guid>::type>
    : std::true_type
{};

struct MyStruct
{
    template <typename T, int guid, typename Enable>
    friend struct has_type_guid;

private:
    enum { _type_guid = 42 };
};

int main()
{
    static_assert(has_type_guid<MyStruct, 42>::value, "");
    return 0;
}

// Test.cpp(30): error : static assertion failed with ""
// static_assert(has_type_guid<MyStruct, 42>::value, "");
// ^

EDIT:

Although, I'm not so sure anymore that this is a bug, since GCC 4.7.1 doesn't compile the code either (complaining that "MyStruct::_type_guid is private"). Microsoft Visual C++ 11.0 compiles it just fine though.

publicaciones de 3 / 0 nuevos
Último envío
Para obtener más información sobre las optimizaciones del compilador, consulte el aviso sobre la optimización.

Hi,

This actually has to with our support for SFINAE (Substitution Failure Is Not
An Error) in microsoft emulation mode.

It turns out the Microsoft compiler does not do access checking in SFINAE
contexts, and in addition, does not do access checking during the
partial instantiation of a function template. In addition, access errors
that occur during the partial instantiation of a function template are ignored
in the Microsoft compiler.

You'll notice that MSVC++ 2010 doesn't complain even if you remove the friend declaration.

So we needed to emulate this behaviour in our Windows based compiler.
We have implemented this and you should see the fix in the next 13.0 update.

You'll note that the GNU compiler (and our Linux based compiler) will
give an error.

thank you for reporting it.

Judy

Oh by the way this is being tracked/fix in our internal bug database under the number DPD200178656.

Deje un comentario

Por favor inicie sesión para agregar un comentario. ¿No es socio? Únase ya