为什么不能使用"( )"为类的非静态数据成员提供默认值?
Why non-static data members of class cannot be given default values using '( )'?
我只是在C++中浏览基本的OOP概念,并遇到了以下内容:
class A{
public:
int i(20); //line 1
};
int main()
{
int j(20);
cout<<j<<endl;
A obj;
cout<<obj.i<<endl;
}
编译时line1
出现以下错误(在 gcc 和 MSVC++ 中都尝试过(,
expected identifier before numeric constant
我知道如何为non-static member
分配默认值(可以从 C++11 开始以不同的方式完成(,但我无法理解为什么只有这种默认值初始化是不可能的,因为在其他任何地方进行相同的初始化(对于普通变量(是有效的。
这种限制的原因可能是什么?
编辑:
从提供的链接和答案来看,这是因为"在某些情况下,它可能读作函数声明。由于这种模棱两可,这是不允许的。
但请考虑以下情况:
//global scope
struct B{
int j;
};
int B = 10;
int object(B);
这也是一个类似的情况,其中int object(B)
可以理解为将B object
作为参数并具有int
返回类型的函数object
。 我在gcc
中尝试过这个,MSVC++
和对象被视为int variable
.为什么在这种情况下不受限制?
使用括号被认为太混乱了,因为它读起来与函数声明非常相似。 考虑默认构造函数的情况:
class A{
public:
int i(); // function declaration -- did you mean to
// use the default constructor instead?
};
不过还有其他方法可以做到这一点:
class A{
public:
int i = 20;
int i{20};
int i = {20};
};
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员