Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;奇怪的警告_C++_Templates_G++_Warnings - Fatal编程技术网

C++ g++;奇怪的警告

C++ g++;奇怪的警告,c++,templates,g++,warnings,C++,Templates,G++,Warnings,在一个玩具项目上工作,我开始回答一个如此多的问题,我被一个我不理解的g++警告淹没了 format.hpp:230: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules 我以前见过这个“错误”,并认为它通常是没有意义的。我看不出你的代码有什么问题。你可以试试新版本的GCC——我似乎记得在4.3-4.4的某个地方看到过这个弹出窗口 编辑:我说过这个警告/错误“通常”是没有意义的。不

在一个玩具项目上工作,我开始回答一个如此多的问题,我被一个我不理解的g++警告淹没了

format.hpp:230: warning: dereferencing pointer ‘<anonymous>’
does break strict-aliasing rules
我以前见过这个“错误”,并认为它通常是没有意义的。我看不出你的代码有什么问题。你可以试试新版本的GCC——我似乎记得在4.3-4.4的某个地方看到过这个弹出窗口


编辑:我说过这个警告/错误“通常”是没有意义的。不是“通常”。我绝对不主张仅仅因为警告令人讨厌而忽略或禁用它们,但在这段代码中,以及在我自己的一些代码中,尽管GCC抱怨,但没有明显的问题。

-fno strict aliasing
(请参阅)关闭GCC的严格别名优化,并且(大概)使用它来警告


另请参见和。

据我所知,这实际上源于
map
中的代码,而不是源于代码本身

根据和,两者都处理地图,并且彼此非常相似,绝对有一些情况下,它会错误地发出警告,因为它无法跟踪对象的动态类型。他们同样表示,在某些情况下,气温会适当升高

此外,它们还表示警告在4.5中已被解除,直到它们能够正确执行为止

最后,您是否尝试按照以下方式重写您的方法,以查看它是否有助于4.3/4.4中的警告

template<typename T>
Dict& operator()(const std::string& name, const T& value)
{
    ValueWrapperBase *vw = new ValueWrapper<T>(value);
    delete env[name];
    env[name] = new ValueWrapper<T>(value);

    return *this;
}
模板
Dict&operator()(常量std::字符串和名称、常量T和值)
{
ValueWrapperBase*vw=新的ValueWrapper(值);
删除环境[名称];
env[name]=新的ValueWrapper(值);
归还*这个;
}

您是否在使用优化来构建?您能在第230行附近发布代码吗?我通常使用g++-O2-Wall进行编译,以捕获大多数可能的错误(-Wall without-O2发现的错误要少得多,因为没有执行流分析)@6502:很清楚,您是否理解警告通常的含义,你会问为什么这个特定的代码违反了别名规则,或者你根本不理解这个警告?@Jalf:我当然理解这个警告的意思,但我不理解为什么我会在这里看到它。我没有在指针或联合上耍什么把戏,所以我不明白别名g++在说什么。+1来反驳无法解释的-1:谢谢,这显然是一个g++错误。现在我明白为什么有时候我会在编译脚本中看到使用<代码> -WNO字符串别名>代码的项目。@ 6502:不,项目使用它是因为它们写得很差,违反了C++标准,所以他们需要禁用一个非常有用的(和有效的)优化。警告通常不是bug,除非您希望代码调用未定义的行为,否则您不应该假设它是bug。在您的特定情况下,它可能是编译器bug,也可能不是编译器bug,但在一般情况下,它不是。@John:不,GCC只是开始严格遵循这些版本的标准(因为它允许更积极的优化)。不幸的是,许多程序员不理解C++的别名规则,并且认为警告可以忽略。@6502:不,我看不出你的代码中有问题(否则我会留下答案),但@John似乎暗示警告通常是毫无意义的,这当然不是事实。我不会接受这一回答,除非他至少澄清,他不是在谈论严格的别名警告。我没有使用联合和指针投射技巧(实际上IIRC在整个项目中根本没有指针投射).gcc发出错误可能是错误的。按照我的想法,关闭严格别名比抑制无法修复的警告要好。@6502,请注意,警告后面紧跟着
/usr/include/c++/4.4/bits/stl_tree.h:179:注意:从这里初始化
提示问题的根源。这指向操作rator->which cast pointers。可能是一种安全的方式,但足以混淆警告逻辑。在我看来,这似乎是g++中的一个bug,但遵循您的示例并避免使用迭代器重写代码,我还是让它编译得很干净(代码也更短)。请参阅我的编辑。
template<typename T>
Dict& operator()(const std::string& name, const T& value)
{
    ValueWrapperBase *vw = new ValueWrapper<T>(value);
    ValueWrapperBase *& p(env[name]);
    delete p;
    p = vw;
    return *this;
}
template<typename T>
Dict& operator()(const std::string& name, const T& value)
{
    ValueWrapperBase *vw = new ValueWrapper<T>(value);
    delete env[name];
    env[name] = new ValueWrapper<T>(value);

    return *this;
}