PYA*_*PYA 6 c++ templates compiler-warnings c++14 c++17
在这段代码中
#include <type_traits>
#include <iostream>
template <class T>
void func(const T& a)
{
if constexpr(std::is_same_v<T,int>)
{
static_cast<void>(a);
}
else if constexpr(std::is_same_v<T,double>)
{
// oops forgot to use it here
}
else
{
}
}
int main() {
func(4);
func("this");
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器不警告 中未使用的变量else-s()?(和-Wall)
我的理解是,逻辑上该方法的实例化是完全不同的。如果该参数未在模板的实例化之一中使用,那么它不是一个未使用的变量吗?或者语言/编译器不会这样解释它。
我们可以说该参数a并不是完全未使用,而是有条件地未使用。
C++ 标准要求为格式错误的程序生成诊断消息。你的程序没有格式错误。C++ 标准根本不要求编译器生成其他警告。因此,由编译器供应商决定如何实现它。
虽然我个人希望收到关于有条件未使用的变量的警告(您的示例是一个很好的演示,为什么),但没有编译器供应商实现了这一点。为什么?他们在大型代码库上测试新版本的编译器,看看新的 C++ 功能是否会导致重大更改。很可能,在这些测试期间,针对像您这样的代码生成了很多警告,但 C++ 专家认为该代码完全没有问题。因此,警告被调整为不会在这种情况下发生。这是为了确保具有 0 个警告的代码是可能的。
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |