【问题标题】:Why does this compile: string = int为什么编译:string = int
【发布时间】:2026-02-23 14:05:02
【问题描述】:

假设如下代码:

#include <iostream>
#include <string>

int func() { return 2; }

int main()
{
   std::string str("str");
   str = func();
   std::cout << "Acquired value: '" << str << "'" << std::endl;

   return 0;
}

为什么str = func(); 行编译时没有类型不匹配的警告?

我正在使用编译器 gcc v. 4.7.1 并设置了 -std=c++11 标志。

输出:

Acquired value: ''

【问题讨论】:

    标签: c++ c++11 gcc stdstring


    【解决方案1】:

    std::string 类包含一个重载的operator=,它接受char 值。由于char 是整数类型,所以int 可以隐式转换为char

    分配给str 的值不是空字符串;它是一个长度为 1 的字符串,其单个字符的值为 2 (Ctrl-B)。

    尝试将程序的输出提供给cat -vhexdump

    $ ./c | cat -v
    Acquired value: '^B'
    

    【讨论】:

    • 并且这个int -&gt; char转换是允许的,因为与C向后兼容,std::string类有string&amp; operator= (char c);重载赋值运算符。
    • 我只是觉得这很奇怪。在复制/粘贴错误后,它还炸毁了工作中的项目。如果编译器至少警告隐式类型转换或类型不匹配会很好......
    • 如果 C++ 编译器警告隐式转换,你就会被警告信息淹没。例如,long n = 42; 具有从 intlong 的隐式转换。我想char 是整数类型的事实是真正的问题。正如析构函数所说,这是从 C 继承的。
    • @KeithThompson:-Wall & -Wconversion 呢?在这里打开它们很有用。
    • @Destructor: g++ -Wconversion 给出warning: conversion to 'char' from 'int' may alter its value [-Wconversion]。 (这实际上并不正确,尽管它可能在char 未签名且CHAR_MAX &gt; INT_MAX 需要CHAR_BIT &gt; 8 的系统上。)
    最近更新 更多