MISRA C ++ 2008,规则14-5-1规定"非成员泛型函数只能在不是关联命名空间的命名空间中声明&#34 ;.
考虑到(例如)超载operator<<()
的情况,我想知道这不是MISRA规则要避免的情况。例如:
#include <iostream>
std::ostream& operator<<(std::ostream &s, int x){
s << "my operator<<" << std::endl;
return s;
}
int main() {
std::cout << 5L << std::endl;
return 0;
}
这会导致不调用我的输出运算符,而是调用STL输出运算符。那么:这是MISRA规则14-5-1违规的一个例子,其中ADL选择了非预期的功能吗?
答案 0 :(得分:1)
据我了解,该规则是为了避免模板(免费)功能与ADL一起使用。
operator<<()
不适用,但以下情况除外(因为T
)
template<class charT, class traits, class T>
basic_ostream<charT,traits>&
operator<< (basic_ostream<charT,traits>&& os, const T& val);
但无论如何,operator
在没有ADL的情况下几乎没用,否则我们必须在使用之前导入它们(我们应该为UDL做operator ""s
)
更好的例子是std::begin
违反了规则:
std::vector<int> v;
begin(v); // -> std::begin(v)
我不明白规则试图阻止哪些错误。