【问题标题】:Automatic conversion from double/int/string to bool in C++在 C++ 中从 double/int/string 自动转换为 bool
【发布时间】:2012-01-25 08:23:23
【问题描述】:

我是一名 Java 程序员,一直在尝试学习一点 C++ 以扩展我的知识。这是一个小代码 sn-p 我认为由于隐式转换而起作用,但我想知道它指的是规范的哪一部分以及我必须注意的其他规则是什么关于隐式转换。是否有制定隐式转换规则的文档/链接/站点?

#include <vector>
#include <iostream>
#include <iterator>

int main(void) {
  using namespace std;
  vector<bool> a;
  a.push_back("asdf");
  a.push_back("");  
  a.push_back(12);  
  a.push_back(0.0);  
  copy(a.begin(), a.end(), ostream_iterator<bool>(cout, "\n"));
  return 0;
}

/*
output:

1
1
1
0
*/

TIA,
佐助

【问题讨论】:

  • 关于您的 code-sn-p 最重要的一点是,vector&lt;bool&gt;vector 的一个特化,并且在多个方面表现不同(但这些都与您的问题无关,只是觉得你应该知道)。使用时要小心。
  • 在 C++ 中不推荐使用向量
  • @Constantinius 你搞错了
  • @sasuke:这是一篇讨论vector&lt;bool&gt;问题的文章:gotw.ca/gotw/050.htm
  • @sasuke: vector&lt;char&gt; 如果你想要一个动态数组,其行为或多或少类似于bool;或deque&lt;bool&gt;,如果您想要一个包含实际bool 值的序列容器;或vector&lt;bool&gt;boost::dynamic_bitset(类似,但界面更丰富)或std::bitset(如果大小是固定的),如果您想最小化内存使用,并且不介意它不是真正的容器.

标签: c++ boolean


【解决方案1】:

所有基本类型都可以隐式转换为bool。任何不是0 的都是TRUE0FALSE

对于用户定义的类型,如果您使用指针,则任何非 NULL 的值都将计算为 TRUE,否则计算为 FALSE

如果使用对象实例而不是指针,则需要声明operator bool()

class A
{
public:
   operator bool() {return false;};
};

//....

A a;
if ( a ) //compiles because of the operator
   //...;

【讨论】:

  • 您能否推断最后一部分,“对象实例”是什么意思?像Person p; 而不是Person* p;
  • @sasuke 完全正确。我写了一个小例子。
  • 请注意,operator bool() 会打开另一个蠕虫罐——这导致了 C++03 中的safe-bool idiomApparently this is obsolete now,不过。
【解决方案2】:

指针和整数以及布尔值都是整数类型。前三个都是指针或整数,因为它们都是非零的,所以它们转换为布尔值truedouble 类型的第四个值转换为零整数值,因此是 false

无法表示为整数值(如无穷大和 NaN)的双精度数的转换未定义。

有关详细信息,请参阅 4.9,有关“布尔转换”,请参阅 4.12:

算术纯右值、无范围枚举、指针或指向成员类型的指针可以转换为 bool 类型的纯右值。将零值、空指针值或空成员指针值转换为 false; 任何其他值都将转换为 true。

您的0.0 是零值的算术类型。

也许你可能不熟悉 C++ 中的字符串字面量:"" 表示数组 char[1] { 0 },这个数组(一个元素)衰减为指向其第一个元素的指针,该指针必然是非空指针.类似地,“asdf”表示一个数组char[5] { 'a', 's', 'd', 'f', 0 },它再次衰减为指向其第一个元素的(非空)指针。角色的实际价值完全无关紧要。

【讨论】:

  • 哇,超级复杂。您在上一段中提到的所有内容(衰减为指针、“”为 char[1] 等)也是规范的一部分(尤其是 char[1] 部分)吗?
  • 关于双打的有趣事实。有没有相关的标准规范?
  • @LuchianGrigore:是的,我引用了它并引用了相关的参考文献。
  • @sasuke:一点也不复杂,如果你想做出准确的陈述,只是有点拗口。大多数真正的 C++ 程序员都有一个思维捷径,所以当他们看到字符串文字时,他们会立即想到“指针”,但有时准确很重要。
  • @LuchianGrigore 非零值被转换为真。
猜你喜欢
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2012-01-14
  • 2012-06-01
  • 2015-12-01
  • 1970-01-01
相关资源
最近更新 更多