首页 > 解决方案 > 避免默认参数中的异常

问题描述

我有一个这样的函数声明:

void foo(std::string const &bar = std::string(""));

现在,我们使用 MISRA C++,我们的代码验证器在默认值的构造函数上给出了错误:

规则 15-5-3:terminate()函数不应被隐式调用。

我知道在创建默认参数的某个地方可能有一个字符串构造(一个明智的编译器无疑会优化它,但 MISRA C++ 的规则也涵盖愚蠢的编译器),也就是说,可以翻译:

foo();

std::string tmp(std::string("")); // May run out of memory, etc
foo(tmp);

但是,有没有办法解决这个问题,除非很明显:

void foo(std::string const &bar);
void foo() { foo(std::string("")); }

这可能会因多个可选参数而变得混乱,但是......

标签: c++c++11misra

解决方案


尝试在函数声明之外初始化默认参数:

const std::string def = "";
...
void foo(std::string const &bar = def);

推荐阅读