c++ - 带空括号的默认构造函数

标签 c++ constructor default-constructor c++-faq most-vexing-parse

是否有任何充分的理由表明一组空的圆括号(圆括号)对于调用 C++ 中的默认构造函数无效?

MyObject  object;  // ok - default ctor
MyObject  object(blah); // ok

MyObject  object();  // error

我似乎每次都自动输入“()”。有充分的理由不允许这样做吗?

最佳答案

最烦人的解析

这与所谓的“C++ 最令人烦恼的解析”有关。基本上,任何可以被编译器解释为函数声明的内容都将被解释为函数声明。

同样问题的另一个实例:

std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());

v 被解释为带有 2 个参数的函数声明。

解决方法是添加另一对括号:

std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());

或者,如果您有 C++11 和可用的列表初始化(也称为统一初始化):

std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};

有了这个,就不可能将其解释为函数声明。

关于c++ - 带空括号的默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53571404/

相关文章:

c++ - 覆盖 new/delete 时,ASAN 无法正确拦截 std::ostringstream 的 str 中的 alloc/free?

c++ - 带有 GunZip 的 AES/GCM,无法正确解压

c++ - std::make_from_tuple 在没有构造函数的情况下无法编译

c++ - 在 C++ 中是否总是需要调用基类构造函数?

c++ - SDL2 根本没有收到任何事件

C++ 从 CreateProcess() 获取 UTF-8 输出

php - 向构造函数注入(inject)多个参数是不好的做法吗?

c++ 在类之间传递对象

java - 为什么 Java 构造函数中有 return

java - 当没有其他构造函数时,是否有理由显式编写默认构造函数?