首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++类名注入

C++类名注入
EN

Stack Overflow用户
提问于 2015-08-02 08:10:07
回答 1查看 661关注 0票数 4

根据标准等级/2:

…类名也被插入到类本身的范围中;这称为注入类名称.…。

此外,basic.cope./9:

注入类名的声明点(第9条)紧跟着类定义的开头大括号。

最后,basic.lookup.classref/3及其示例:

如果不合格id为~ type-name,则查找类型名称…。

代码语言:javascript
运行
复制
struct A { };
struct B {
    struct A { };
    void f(::A* a);
};
void B::f(::A* a) {
    a-> ~ A(); // OK: lookup in *a finds the injected-class-name
}

到目前为止,我们可以收集到:

  1. 在A类的作用域中,有一个名称A。
  2. 该名称是在A类的定义大括号开头声明的。
  3. 这个名字命名了一种类型。

如果上面的内容是正确的,那么为什么以下代码无法编译(在MSVC2015中):

代码语言:javascript
运行
复制
struct inj
{};

typedef struct inj::inj inj2;

错误信息

错误C2039 '{ctor}':不是'inj‘的成员

似乎与标准不符:

注意:例如,构造函数不是精化类型说明符中可接受的查找结果,因此不会使用构造函数来代替注入的类名。-end注记

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-02 09:34:09

由于以下代码在其他编译器中正确编译和运行,所以它是MSVC2015中的一个bug。

代码语言:javascript
运行
复制
#include <boost/type_index.hpp>
#include <iostream>

struct inj
{
    int g;
};

typedef struct inj::inj inj2;

int main()
{

    inj2 ii;
    std::cout << boost::typeindex::type_id_with_cvr<decltype(ii)>().pretty_name() << '\n';
}

更新:报告为臭虫

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31769853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档