c++ - 这两个 C++ 初始化器语法在语义上是否有所不同?

标签 c++ language-features initializer language-lawyer

假设以下代码是可以正确编译的合法代码,T 是类型名,x 是变量名。

语法一:

T a(x);

语法二:

T a = x;

这两个表达式的确切语义是否不同?如果是,在什么情况下?

如果这两个表达式确实具有不同的语义,我也很好奇标准的哪一部分讨论了这一点。

此外,如果 T 是标量类型的名称(也称为 intlongdouble,等等...),当 T 是标量类型与非标量类型时有什么区别?

最佳答案

是的。如果 x 的类型不是 T,则第二个示例扩展为 T a = T(x)。这要求 T(T const&) 是公开的。第一个示例不调用复制构造函数。

在检查了可访问性之后,就可以删除拷贝(正如 Tony 所指出的)。但是,在检查可访问性之前不能消除它。

关于c++ - 这两个 C++ 初始化器语法在语义上是否有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5064296/

相关文章:

c++11 用户定义文字,与编译/执行二分法冲突

c++ - 从原始 pcm 到 OGG Vorbis 的 libav 音频编码示例

Python ? (条件/三元)赋值运算符

ruby-on-rails-3 - Rails 如何在 gem 中创建初始化程序

swift - 如何在 swift 中使用便利初始化程序设置非可选变量?

c++ - 将类作为模板参数,并将类构造函数的参数作为方法参数的方法

c++ - boost Python(Suse 和 Ubuntu)

matlab - 如何获得矩阵的唯一切片?

dart - 如何在 Dart 中进行惰性评估?

Ruby:是否有带有 attr_initialize 方法的 gem?