MISRA C ++规则14-5-1 :(不要在关联的命名空间中声明泛型函数)适用于std :: operator&lt; <! - ?

时间:2018-02-12 14:22:55

标签: c++ function generics argument-dependent-lookup misra

MISRA C ++ 2008,规则14-5-1规定&#34;非成员泛型函数只能在不是关联命名空间的命名空间中声明&#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选择了非预期的功能吗?

1 个答案:

答案 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)

我不明白规则试图阻止哪些错误。