C++ g++;不显示';未使用的';警告

C++ g++;不显示';未使用的';警告,c++,g++,C++,G++,我有一小段C++代码: #include <iostream> #include <iterator> #include <string> using namespace std; int main() { int i=0; istream_iterator<string> EOS; double x; return 0; } 并获得: test.cc: In function 'int main()':

我有一小段C++代码:

#include <iostream>
#include <iterator>
#include <string>

using namespace std;

int main() {

    int i=0;
    istream_iterator<string> EOS;
    double x;

    return 0;
}
并获得:

test.cc: In function 'int main()':
test.cc:9: warning: unused variable 'i'
test.cc:11: warning: unused variable 'x'

为什么对未使用的EOS没有警告?

它不是一个基本值,因此它的构造函数和/或析构函数可能会产生预期的副作用

为了说明在实践中会发生这种情况:我使用一个类来计时代码的各个部分,大致如下所示:

class Timed {
    double start;
    public:
        Timed() { start = now(); }
        ~Timed() { std::cout << (now() - start) << '\n'; }
}
变量
t
从未被使用过,但它对代码的行为仍然很重要。

istream\u迭代器有一个构造函数,因此
EOS
的声明实际上不像
i
x
的声明那样是不可操作的


通常,您希望声明一个类类型对象,然后不对其执行任何操作。例如,在C++ 0x中考虑<代码> STD::LoopSuxGue//Cuff>(<代码> Boo::SopEdjyLoop< <代码>升压)或任何其他类型的范围守护类。您通常不想对此类对象执行任何操作,您只想创建对象,以便在块的末尾运行其析构函数,以执行需要执行的任何清理操作。

,因为这样做是有目的的。它不是原始的。也许构造函数和析构函数做了一些重要的事情

MFC甚至有这样操作的类,您可以这样做:

void foo()
{
    CWaitCursor cursor;

    [...]
}

这将在函数执行期间显示一个沙漏图标。

+1用于使用析构函数计算计时结束。酷伎俩。它叫RIAA,从C++诞生以来一直是一个设计目标(见Bjarne Stroustrup)@塞赫你可能是RAII:——不是吗?应该看到这让我想起了性能跟踪:)它使用相同的机制来跟踪函数/块的性能(免责声明:我是这个库的开发人员)--woops刚刚注意到这个线程非常古老:)SOFACT万岁:
EOS
不是
lock\u-guard
或任何类型的变量,其唯一用途是其析构函数的效果,这是大多数情况下发生的情况,有
std::string
,等等。因此,这里确实应该有一个警告,因此,用户注意到它可以消除变量,从这个意义上讲,未使用的
std::string
与未使用的
int
在高级别上有什么大区别?没有一个这是C++中的一个设计问题。@ PopPrPyChio编译器必须非常聪明地推断出,而<代码> ~ istrAMyIdActuple()/Cuth>并不微不足道,EthCudith> istRAMMyTyror()/<代码>和 ItReMaMyTyror()/<代码>具有与它们相同的结果。在一般情况下,这种聪明是不可能的,因此必须有一个分析停止的点early@Caleth这些是实施细节。我在高层次上指出了语言问题,当你看代码的时候,你需要一个简单的回答:“这不是程序员明确使用的吗?”。您可以回答它,但是C++编译器不能,因为它只看到由语言定义的“使用”,它考虑析构函数,这与所提出的问题无关。
void slow() {
    Timed t;
    // heavy operation here...
}
void foo()
{
    CWaitCursor cursor;

    [...]
}