MSVC 使用 constexpr 从可变参数模板方法中的基本模板参数中吞下 const if
MSVC swallows const from fundamental template parameter in variadic template methods using constexpr if
我有一个问题,我几乎可以肯定这是一个 MSVC 错误,但也许我遗漏了什么。
这里是实际代码的简化版本:
template <typename... Args>
class InnerType {};
template <typename... Args>
class OuterType {
public:
void foo1() {
if constexpr (true) {
bar(InnerType<Args...>());
}
}
void foo2() {
if (true) {
bar(InnerType<Args...>());
}
}
void bar(InnerType<Args...>) {}
};
如您所见,foo1()
和 foo2()
之间的唯一区别是 constexpr if。以下是我尝试在 MSVC 中编译一些测试时发生的情况:
OuterType<const bool> test1;
test1.foo1(); // does not compile
test1.foo2(); // compiles
OuterType<bool> test2;
test2.foo1(); // compiles
test2.foo2(); // compiles
我得到的 test1.foo1()
错误是:
error C2664: 'void OuterType<const bool>::bar(InnerType<const bool>)':
cannot convert argument 1 from 'InnerType<bool>' to 'InnerType<const bool>'
使用 GCC 在 Linux 上编译相同的代码没有问题。此外,在 MSVC 中对非基本类型进行相同的尝试也适用:
class SomeType {};
OuterType<const SomeType> test;
test.foo1(); // compiles
test.foo2(); // compiles
因此,似乎出于某种原因,当使用 constexpr if 和 const 基本类型作为模板参数时,const
被吞没了。如果不是可变参数模板,则不会出现此问题。
Here 是一个活生生的例子。
我假设这是编译器错误是否正确?
So it turned out to be a bug. 对于遇到相同问题的任何人,Microsoft 表示他们将在 VS 15.8 Preview 4 中修复它。
我有一个问题,我几乎可以肯定这是一个 MSVC 错误,但也许我遗漏了什么。
这里是实际代码的简化版本:
template <typename... Args>
class InnerType {};
template <typename... Args>
class OuterType {
public:
void foo1() {
if constexpr (true) {
bar(InnerType<Args...>());
}
}
void foo2() {
if (true) {
bar(InnerType<Args...>());
}
}
void bar(InnerType<Args...>) {}
};
如您所见,foo1()
和 foo2()
之间的唯一区别是 constexpr if。以下是我尝试在 MSVC 中编译一些测试时发生的情况:
OuterType<const bool> test1;
test1.foo1(); // does not compile
test1.foo2(); // compiles
OuterType<bool> test2;
test2.foo1(); // compiles
test2.foo2(); // compiles
我得到的 test1.foo1()
错误是:
error C2664: 'void OuterType<const bool>::bar(InnerType<const bool>)':
cannot convert argument 1 from 'InnerType<bool>' to 'InnerType<const bool>'
使用 GCC 在 Linux 上编译相同的代码没有问题。此外,在 MSVC 中对非基本类型进行相同的尝试也适用:
class SomeType {};
OuterType<const SomeType> test;
test.foo1(); // compiles
test.foo2(); // compiles
因此,似乎出于某种原因,当使用 constexpr if 和 const 基本类型作为模板参数时,const
被吞没了。如果不是可变参数模板,则不会出现此问题。
Here 是一个活生生的例子。
我假设这是编译器错误是否正确?
So it turned out to be a bug. 对于遇到相同问题的任何人,Microsoft 表示他们将在 VS 15.8 Preview 4 中修复它。