为什么在对象表达式的上下文中找不到我的构造函数

Why is my constructor unable to be found in the context of an object expression?

本文关键字:找不到 我的 构造函数 上下文 对象 表达式 为什么      更新时间:2023-10-16

代码示例:

#include<iostream>
struct A
{
    int a;
    A(){ a = 5; }
};
int main()
{
    A *a = new A();
    std::cout << a->A;//A is injected-class-name
}

为什么会找到注入的类名而不是构造函数?此外,即使我们编写以下内容,我们也不能调用构造函数:

#include<iostream>
struct A
{
    int a;
    A(){ a = 5; }
};
int main()
{
    A *a = new A();
    std::cout << a->A::A//A::A denote injected-class-name
}

尽管如此,3.4.3.1/1说:

在函数名不被忽略并且嵌套名称说明符指定类C:——如果指定的名称在嵌套的名称说明符之后,当在C中查找时,是C的注入类名(第9条(,或者[…]被认为是命名C类的构造函数。

在名称查找期间的对象表达式中,后面跟在->之后,函数不会被忽略。

那么,为什么在这种情况下找不到构造函数呢?

我真的不能说它比标准更好:


12.1建设者[class.ctor]

构造函数没有名称。使用特殊的声明符语法来声明或定义构造函数。

在您的代码中,A不是函数的名称。

那么,为什么在这种情况下找不到构造函数呢?

阅读您的报价:

如果在嵌套名称说明符[…].之后指定的名称

嵌套的名称说明符在末尾包含一个::(作用域解析运算符(。你在a->A中看到::了吗?