【发布时间】:2017-12-20 14:50:39
【问题描述】:
我有这个 MCVE:
#include <stdio.h>
#include <string>
#include <utility>
#include <vector>
enum class someEnum { first, second, none, };
template<typename T> class fooClass
{
public:
fooClass( std::vector<std::pair<const char *, T>> _classObject )
: classObject( _classObject ) {};
auto findMember( const std::string & memberName, T defaultReturn ) const -> T;
private:
const std::vector<std::pair<const char *, T>> classObject;
};
template<typename T> auto fooClass<T>::findMember( const std::string & memberName,
T defaultReturn
) const -> T
{
for ( auto const & it : classObject ) {
if ( 0 == memberName.compare( it.first ) ) {
return it.second;
}
}
return defaultReturn;
}
int main() {
fooClass<someEnum> somePairs( {
{ "text1", someEnum::first }, { "text2", someEnum::second }, });
printf( "Value=%d\n", somePairs.findMember( "text2", someEnum::none ) );
}
我跑了Cppcheck,它告诉我:
总结:函数参数'_classObject'应该通过 参考。消息:参数“_classObject”按值传递。它 可以作为 (const) 引用传递,这通常更快,并且 推荐在 C++ 中。
对于这一行:
fooClass( std::vector<std::pair<const char *, T>> _classObject )
: classObject( _classObject ) {};
好的,我把classObject的声明改成这样:
| Added the & operand
V
const std::vector<std::pair<const char *, T>> & classObject;
gcc 具有最高警告级别接受此更改,但是当我运行程序时它崩溃了。崩溃的原因是it.first 为空。
如果使用了引用并且程序可以正常工作,我需要进行哪些更改?
【问题讨论】:
-
只有函数本地
const&s 可以延长临时对象的生命周期 - 而不是对象中的引用成员。如果您希望您的参考成员保持有效,那么只要参考存在,就让参考对象存活;就这么简单。但是,那里的引用可能不是您真正想要的......“应该传递”的意思就是,而不是“应该存储在其他对象中”。 -
建议是针对您的构造函数参数,而不是针对您的类成员。您正在引用一个在您使用时已被销毁的临时文件。
-
@AlBundy François 得到了答案;我只是闲聊了一些别的东西,然后编辑提到弗朗索瓦在说什么。
标签: c++ templates pass-by-reference cppcheck