Правильно ли MSVC отклоняет этот код с помощью /permissive-?C++

Программы на C++. Форум разработчиков
Anonymous
 Правильно ли MSVC отклоняет этот код с помощью /permissive-?

Сообщение Anonymous »

Вот полный пример на godbolt.org, а код скопирован ниже:

Код: Выделить всё

#include 
#include 
#include 

namespace foo {
template 
using size_t = int;
}

using namespace foo;

struct Foo {
Foo() : a{} {}
std::array a;
};

int main() {}
MSVC при компиляции с флагом /permissive- отклоняет код с таким сообщением:

Код: Выделить всё

predefined C++ types (compiler internal)(421): error C2872: 'size_t': ambiguous symbol
: note: could be 'unsigned __int64 size_t'
(7): note: or       'foo::size_t = int'
predefined C++ types (compiler internal)(421): note: the template instantiation context (the oldest one first) is
(13): note: see reference to function template instantiation 'void __builtin_array_init_helper(_T *,size_t) noexcept' being compiled
with
[
_Ty=std::optional,
_T=std::optional
]
Compiler returned: 2
С другой стороны, как MSVC без этого флага, так и Clang и GCC с флагом -fno-permissive или без него принимают код.
Кроме того, учитывая случай MSVC with /permissive-, каждое из следующих изменений приводит к компиляции кода:
  • удаление слоя std::array из,
  • удаление слоя std::optional слоя из,
  • удаление заданного вручную ctor по умолчанию,
  • удаление только списка инициализаторов из ctor по умолчанию,
    удаление директивы using namespace foo;.
Учитывая все эти детали, у меня возникнет искушение сделать вывод, что MSVC ошибается. Даже в этом случае, что может быть сделано неправильно (с точки зрения реализации или интерпретации стандарта), что привело к ошибке?

Подробнее здесь: https://stackoverflow.com/questions/790 ... permissive

Вернуться в «C++»