Visual c++ Visual C++;如果在另一个类模板中使用if constexpr语句,则编译失败

Visual c++ Visual C++;如果在另一个类模板中使用if constexpr语句,则编译失败,visual-c++,compiler-errors,c++17,class-template,if-constexpr,Visual C++,Compiler Errors,C++17,Class Template,If Constexpr,我编写了一个矩阵类模板,其中包括算术运算符,这些运算符专门用于使用if-constexpr语句的某些类模板参数。这种矩阵类在另一个模板类中的使用可能会导致在使用VisualC++编译器(版本19.00 .24245)编译之前不能使用形式“符号”的错误信息。如果矩阵类模板在另一个类模板中使用,然后在Linux或最新的Apple clang版本上使用g++7.4.0进行编译,或者在非类模板中使用,然后使用Visual C++编译器进行编译,则编译成功 为了能够再现上述问题,下面给出了包含向量类模板的

我编写了一个矩阵类模板,其中包括算术运算符,这些运算符专门用于使用if-constexpr语句的某些类模板参数。这种矩阵类在另一个模板类中的使用可能会导致在使用VisualC++编译器(版本19.00 .24245)编译之前不能使用形式“符号”的错误信息。如果矩阵类模板在另一个类模板中使用,然后在Linux或最新的Apple clang版本上使用g++7.4.0进行编译,或者在非类模板中使用,然后使用Visual C++编译器进行编译,则编译成功

为了能够再现上述问题,下面给出了包含向量类模板的代码段,该向量类模板具有一个模拟上述矩阵类结构的运算符、编译器标志以及错误消息。注释掉第160行并将注释表单第185行切换到第186行将导致编译案例

#包括
#包括
枚举类布局
{
标准
颠倒
};
模板
Vec类
{
公众:
使用ValueType=T;
静态constexpr auto numElements=numEls;
静态constexpr自动布局=布局;
Vec()=默认值;
模板
向量(Ts…VAL)
:els_{}
{
静态断言(sizeof…(Ts)=numEls);
T_tmp[]={vals…};
if constexpr(布局=布局::标准)
{
for(auto i=decltype(numEls_u2;){0};i
从Rhs(常数Rhs和Rhs)进行的无效分配
{
静态断言(std::is_same_v);
静态断言(Rhs::numElements==numEls);
自动tmp=rhs.Data();
if constexpr(Rhs::layout==布局)
{
for(auto i=decltype(numEls_u2;){0};i
车辆主管(建筑右侧和右侧)
{
从rhs(rhs)转让;
}
模板
向量和运算符=(常量Rhs和Rhs)
{
从rhs(rhs)转让;
归还*这个;
}
void Cout()常量
{
std::cout-foo;
foo.v1=v1;
foo.v2=v2;
foo.v1_uu.Cout();
foo.v2_uu.Cout();
foo.DoSomething();
foo.v3_uu.Cout();
返回0;
}

我的第一个问题是,上述代码是否有问题,即它不符合C++17标准,或者是否缺少编译器标志,或者编译错误是否是由于Visual C++编译器中的错误造成的?此外,我想问的是,如何修改代码,以便在ut更改其一般结构,例如,放弃使用if constexpr语句?(不使用模板专门化(在矩阵类中)的原因是,由于需要专门化多个模板参数并同时接受代理类作为参数,它将显著增加代码大小。)

您当然可以将此示例最小化更多?(当您说“显著增加代码大小”时,您是指源代码大小,对吗?)在
\u MSC\u FULL\u VER
is
192127702
/JMC /permissive- /GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc142.pdb" /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /std:c++17 /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\TplTplAutoTest.pch" /diagnostics:column 
Error   C3536    'i': cannot be used before it is initialized   [... line] 135  
Error   C3536    'tmp': cannot be used before it is initialized [... line] 137  
Error   C2109    subscript requires array or pointer type   [... line] 137  
Error   C3536    'i': cannot be used before it is initialized   [... line] 144  
Error   C3536    'j': cannot be used before it is initialized   [... line] 146  
Error   C2109    subscript requires array or pointer type   [... line] 146