Почему переключатель компилятора /Zc:twoPhase-
, следующий за переключателем /permissive-
, не приводит к исчезновению ошибок компиляции в MSVC 19.13, точно так же, как они исчезают после полного удаления ключа / permissive-`со следующим кодом проблемы
#include <stdio.h>
template <unsigned int BYTES>
class CBase
{
public:
char Arr[BYTES];
int Fn1(void) {
return Arr[1] ^ Arr[sizeof(Arr)-1];
}
int Fn2(void) {
return Arr[2] ^ Arr[sizeof(Arr)-2];
}
};
template <unsigned int BYTES>
class CDerived : public CBase<BYTES>
{
public:
int FnSum(void) {
return Fn1() + Fn2() + Arr[0]; // ERRORs: identifiers "Fn1" and "Fn2" and "Arr" are NOT found !
}
};
int main(void)
{
CDerived<32> ddd;
printf("%d\n", ddd.Fn1()); //No error here
printf("%d\n", ddd.Fn2()); //No error here
printf("%d\n", ddd.FnSum());
return (int)ddd.Arr[0]; //No error here
}
Приведенный выше код компилируется в MSVC v19.10, когда переключатель /permissive-
полностью удален.
Смотри: https://godbolt.org/g/Yxw89Y
ПРИМЕЧАНИЕ. Я не могу включить ссылку на пример на http://godbolt.org вместе с переключателями /permissive- /Zc:twoPhase-
, поскольку последний компилятор Godbolt MSVC (v19.10) устарел и не поддерживает /Zc:twoPhase-
переключатель компилятора.
Согласно этой статье и этой статье , ошибка компиляции в MSVC происходит из-за включенного поиска двухфазного имени в соответствии со стандартным режимом C ++ (включается опцией /permissive-
).
Кроме того, согласно бывшей статье : « Опция /permissive-
неявно задает соответствующее поведение компилятора двухфазного поиска, но его можно переопределить с помощью /Zc:twoPhase-
switch ».
Однако добавление двух ключей компилятора /permissive- /Zc:twoPhase-
(в таком порядке) не отменяет его и не приводит к исчезновению ошибок компиляции в MSVC v19.13.
Контекст этой проблемы см. В этой записи .