将参数传递给函数

The*_* do 4 c++ coding-style

将arg传递给一个不是"完全匹配"类型的函数但是通过简单或用户定义的转换到这种类型是不是一个糟糕的编程原则?例如:

void f(bool option);
Run Code Online (Sandbox Code Playgroud)

主要是后来的(这是非常假设的,所以请不要就该代码提出建议):

int a = getSomeValue();

f(a);//here instead of bool I'm passing int - is it a bad programming practice or not?
Run Code Online (Sandbox Code Playgroud)

Ale*_*ler 6

我想大多数人会考虑这种不好的做法.写作f(a !=0)更清晰,简明扼要地表达了意图.


Ste*_*sop 6

转换为bool是一种特殊情况,因为它的行为不像整数转换,因此很多人都喜欢将它看成是显式的,!= 0而不是使用强制转换.

如果你传递int给一个需要的函数long,那么我当然不希望看到任何类型的显式转换混乱.同样地,我不希望看到char*强制转换const char*为了传递给它strlen.那些转换"实际上没有做任何事情":它们总是保留输入的值,而在指针的情况下,它不会让你对使用原始指针无法做的referand做任何事情.

如果你传递的unsigned long是一个函数unsigned int,那么在一些实现上(但绝不是所有常见的函数),它是一个"缩小转换",它取决于值可以通过取模数来丢弃信息.在这种情况下,将转换显式化通常是一个好主意,这样随意读者就不必检查函数签名就能意识到它发生了.这些转换"做点什么"可能会令人惊讶.

在整数和浮动类型之间进行转换时也是如此:尽管int -> double对于您将看到的几乎任何实现都是无害的,但double -> int对于某些值具有未定义的行为,因此您不希望读者错过它.

但是,有时会提供非常复杂的用户定义转换,以便您可以调用函数并从隐式转换中获益.因此,对于那些,您应该遵循在定义转换的任何API中的使用示例.

例如,如果Foo有一个带有a的隐式构造std::string函数,而某些函数bar带有a Foo,那么与调用者的POV bar相比,这与API只提供了一个显式转换但是两个重载bar,一个取Foo一个和一个需要std::string但直接将其转换Foo为另一个并调用另一个.因此,在这样的情况下依赖转换并不比重载函数更糟糕.后者不被视为本世纪的罪行.除了Python程序员.