【问题标题】:String constructor with a int is not printed不打印带有 int 的字符串构造函数
【发布时间】:2019-12-10 11:23:34
【问题描述】:
    1. string s6 {0};
    2. string s5 {'a','b',7};
    cout << "S6 ::: " << s6 << endl; 
    cout << "S5 ::: " << s5 << endl;
  1. 预期未定义的行为“nullptr”,但会打印一个空字符串。
  2. 打印ab 不是预期的行为。

在 QT5 上运行。. MacOs 上的编译器叮当声

【问题讨论】:

  • “期望未定义的行为..”是什么意思?当有 ub 时,你不应该期待任何东西
  • 你期望得到什么作为 2) 的输出?
  • 首先,您为什么会期待未定义的行为?其次,你怎么知道你没有观察到未定义的行为?
  • 尝试第二个{'a', 'b', 99},你会在输出中看到abc
  • 这就是为什么常见的建议“总是用 { } 初始化”可能是罪魁祸首...

标签: c++ string constructor initialization initializer-list


【解决方案1】:

在这两种情况下

1. string s6 {0};
2. string s5 {'a','b',7};

这里使用了接受初始化列表的构造函数。

在第二种情况下,整数文字 7 可以用 char 类型表示。所以没有缩小转换。

考虑以下程序。

#include <iostream>
#include <string>

int main() 
{
    std::string s6 {0};
    std::string s5 {'a','b',7};

    std::cout << s6.size() << ": ";

    for ( char c : s6 ) std::cout << static_cast<int>( c ) << ' ';
    std::cout << '\n';

    std::cout << s5.size() << ": ";

    for ( char c : s5 ) std::cout << static_cast<int>( c ) << ' ';
    std::cout << '\n';

    return 0;
}

它的输出是

1: 0 
3: 97 98 7 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 2018-12-03
    • 2019-09-26
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多