Почему Visual Studio 2015 не может скомпилировать библиотеку STL с noexcept, когда присутствует Juce?

Я получаю много ошибок в STL (set, vector, deque и т. д.), где используется макрос _NOEXCEPT_PO. Тот же код прекрасно компилируется в Visual Studio 2010, STL которого не включает _NOEXCEPT_PO макросов. Я воспроизвел эту ошибку на трех компьютерах. Существуют ли дополнительные определения preproc, о которых мне нужно знать?

Указана ошибка:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\vector:852: предупреждение: C4346: 'std::vector‹_Ty,_Alloc>::std::vector‹_Ty,_Alloc>::_Alty ::propagate_on_container_move_assignment::value': зависимое имя не является типом

_Myt& operator=(_Myt&& _Right)
    _NOEXCEPT_OP(_Alty::propagate_on_container_move_assignment::value
        || _Alty::is_always_equal::value)
    {   // assign by moving _Right
    if (this != &_Right)
        {   // different, assign it
        _Tidy();
        if (_Alty::propagate_on_container_move_assignment::value
            && this->_Getal() != _Right._Getal())
            this->_Move_alloc(_Right._Getal());

        _Assign_rv(_STD forward<_Myt>(_Right));
        }
    return (*this);
    }

_NOEXCEPT_OP определяется как:

#define _NOEXCEPT   noexcept
#define _NOEXCEPT_OP(x) noexcept(x)

Изменить:

Работая над тем, чтобы сократить это до небольшого примера, я обнаружил, что именно включение заголовков Juce имело значение. К сожалению, сообщение об ошибке было не очень полезным, поэтому я не понял, что включение Juce было уместным.

Исправление этой конкретной проблемы заключается в определении: JUCE_COMPILER_SUPPORTS_NOEXCEPT=1


person Ken    schedule 06.10.2017    source источник
comment
Это всего лишь предупреждение, и оно выглядит совершенно излишним — нет причин, по которым зависимое имя обязательно должно быть типом. Я предлагаю отключить его.   -  person Quentin    schedule 07.10.2017
comment
@Quentin нет, это совсем не лишнее. Это способ Microsoft сообщить вам, что вам может понадобиться ключевое слово typename.   -  person n. 1.8e9-where's-my-share m.    schedule 07.10.2017
comment
Предоставьте минимально воспроизводимый пример.   -  person rustyx    schedule 07.10.2017
comment
@н.м. в выражении предложения noexcept?!   -  person Yakk - Adam Nevraumont    schedule 07.10.2017
comment
@Yakk Везде, где вы пропустите обязательное ключевое слово для имени типа. Конечно, это включает в себя выражения noexcept, почему бы и нет?   -  person n. 1.8e9-where's-my-share m.    schedule 07.10.2017
comment
@н.м. хотя там нет отсутствующего имени типа.   -  person Yakk - Adam Nevraumont    schedule 07.10.2017
comment
@н.м. value — это bool, а не тип, и это совершенно нормально. typename на самом деле сломает его. Но я понимаю, откуда вы пришли — у них также есть расширение, делающее typename необязательным.   -  person Quentin    schedule 07.10.2017
comment
@Quentin Есть много ошибок. Все они связаны со строкой _NOEXCEPT_OP.   -  person Ken    schedule 08.10.2017


Ответы (1)


Исправление для этой конкретной проблемы состоит в том, чтобы определить: JUCE_COMPILER_SUPPORTS_NOEXCEPT=1

person Ken    schedule 08.10.2017