#include <string>
using namespace std;
int main()
{
string s; // no warning
int i; // warning C4101
return 0;
}
- 为什么Visual Studio警告我未使用的变量
i
而不是示例中的s
? - 我假设编译器不确定字符串构造函数的副作用。这是不显示警告的原因吗?
- 我可以以某种方式启用有关未使用的字符串变量的警告吗?
我的警告级别设置为 4。
我假设编译器只警告未使用的变量,用于平凡的可构造/可破坏类型。
template<typename>
struct Empty
{
};
template<typename T>
struct Trivial : Empty<T>
{
int* p;
int i;
};
template<typename>
struct NonTrivial
{
NonTrivial() {}
};
template<typename>
struct TrivialE
{
TrivialE& operator=(const TrivialE&) {}
};
struct NonTrivial2
{
NonTrivial2() {}
};
struct NonTrivialD
{
~NonTrivialD() {}
};
int main()
{
Empty<int> e; // warning
Trivial<int> t; // warning
NonTrivial<int> n; // OK
TrivialE<int> te; // warning
NonTrivial2 n2; // OK
NonTrivialD nd; // OK
}
编译器处理比较
可以看出,它们是一致的。
由于std::string
不可能是微不足道的可破坏的,因此编译器不会对此发出警告。
所以回答你的问题:你不能。
没有警告,因为实际上没有未使用的变量s
。 s
是 string
类的一个实例,这个类有一个构造函数,该构造函数在声明string s;
调用,因此s
由它的构造函数使用。
std::string
不是基元类型,而int
是。非基元类型具有构造函数和析构函数,它们可以执行一些有用的功能:内存管理、输出到屏幕等,因此声明非基元类型并不一定意味着不使用变量。 当然,string
不会做这样的事情,但可能它们会抑制对已知类型的警告,同时考虑到您可能会想出重新细化string
行为的想法(您可以通过编辑一些头文件来做到这一点,因为string
是基于模板类的(。