C++ 作业中的等括号 (=) 和大括号 ({}) 之间有什么(微妙的?)区别?

What is the (subtle?) difference between equal (=) and curly braces ({}) on C++ assignments?

提问人:nostromo 提问时间:1/6/2023 最后编辑:Joris Timmermansnostromo 更新时间:1/6/2023 访问量:138

问:

#include "std_lib_facilities.h"

class Token {
public:
        char kind;
        double value;
        string name;
        Token ( char ch ) : kind{ch} { } 
        Token ( char ch, double val ) : kind {ch}, value {val} { } 
        Token ( char ch, string n ) : kind {ch}, name {n} { } 
};


int main ( void )
{
        char ch; 

        cin >> ch;    

        // Token == ch; // Fails to compile - see below.
        Token {ch};

        return 0;
}

与 这个错误是什么意思?Token {ch};Token = ch;

error: expected unqualified-id

ERROR WHEN USING `Token =  ch;`.
$ c++ -std=c++11 -o poc_Token_assignments poc_Token_assignments.cpp
poc_Token_assignments.cpp:20:8: error: expected unqualified-id
        `Token =  ch;`
              ^
1 error generated.

使用大括号时不会出错 ():Token {ch};

$ c++ -std=c++11 -o poc_Token_assignments poc_Token_assignments.cpp
$   (COMPILED PERFECTLY USING THOSE {} CURLY BRACES)
C++ 变量 assign 赋值运算符 大括号

评论

5赞 Richard Critten 1/6/2023
Token {ch};创建一个临时对象,然后将其丢弃在 . 是无效的语法。Token;Token = ch;
1赞 463035818_is_not_an_ai 1/6/2023
stackoverflow.com/questions/388242/......
2赞 463035818_is_not_an_ai 1/6/2023
为什么你认为这种差异是“微妙的”?你真的是说吗?那不是分配Token t = ch;
0赞 nostromo 1/6/2023
我正在尝试理解 Bj Strup 书(“使用 C++ 的 PROG Pples 和 Ptice”)上calculator02.cpp示例的整个代码 [准备解决calculator02_buggy.cpp版本挑战]。关键是这本书一开始很流畅,但随后突然假设了很多 OOP 概念(之前没有解释任何事情,甚至使用像“std_lib_facilities.h”这样的个人库,这从一开始就很疯狂。更不用说C++11,99版本...然后我不得不浏览大量 ytbe 视频并阅读 stackoverflow 和任何地方,以了解初始化器列表......等。。。
1赞 nostromo 1/6/2023
要了解无数的事情......还不够,程序是非常递归的,所以这是另一层困难。正如我从您的回答中看到的那样,我正在将错误的经典变量赋值与 OOP 概念合并。我放在这里的 POC(概念证明)代码来自代码上的开关:......箱。。。箱。。。返回 Token {ch};让每个字符代表它的大小写......箱。。。。使用您的答案,我看到的是这个“返回”,返回一个初始化构造函数?不是作业。那是?

答:

3赞 Frodyne 1/6/2023 #1

很简单,看看这三行:

5;          // Creates an int literal which goes away right away
int = 5;    // Syntax error: Cannot assign a value to a type
int a = 5;  // Correct: Store the value 5 in the variable a

现在对于您的代码:

Token {ch}与第一行类似。A 被创建,然后立即销毁。Token

Token = ch与第二行类似:不能为类型赋值。

我认为你想要的是其中之一:

Token t = ch;
Token t{ch};
Token t(ch);

对于最后两者之间的区别,我将向您推荐: 列表初始化(使用大括号)的优点是什么? 或者也许更好;一本好书。

评论

0赞 nostromo 1/6/2023
还行。我会喝杯咖啡,慢慢读完这一切。最后一个问题:你刚才指出的链接中提到的这本书(Bjrn Strup的“T C++ Progr Lang 4th Edit”)是一本很好的书,可以很好地学习,吸收和实践所有这些概念,还是你认为会有另一个建议(我不得不说我正在使用Kochan的学习C,很棒......解释每个概念并引出示例和问题到代码中)。这个 Bj 就像 C++ 的教皇,肯定会在 C++ 的精确架构和深度抽象中登上天空,但有没有像 kochan 这样的方法?
0赞 Frodyne 1/6/2023
我没有读过那么多C++书,所以我会向你推荐这个 StackOverflow C++ 社区似乎好评的书列表: stackoverflow.com/questions/388242/... (你提到的 Bjarne Stroustrup 书在上面,但评论确实说:“这不是一本给新手程序员的书”)
0赞 463035818_is_not_an_ai 1/9/2023
也许 OPs 线更好的类比是int{5};