【问题标题】:Explicitly invoking `int` destructor - why is a type alias required? [duplicate]显式调用 `int` 析构函数 - 为什么需要类型别名? [复制]
【发布时间】:2018-03-07 20:50:37
【问题描述】:

下面的程序...

int main()
{
    int{1}.~int();
}

无法在 上编译(请参阅 conformance viewer

  • clang++ 主干,带有-std=c++1z

  • g++ 主干,带-std=c++1z

  • CL 19 2017


int引入一个类型别名...

int main()
{
    using X = int;
    int{1}.~X();
}

...使程序在所有前面提到的编译器上都有效,没有警告(参见conformance viewer

为什么在调用int 的析构函数时需要类型别名?这是因为int 不是用于销毁调用的有效语法元素吗?

【问题讨论】:

  • 为什么要调用 int 析构函数?
  • @manni66:这在通用上下文中是有意义的(例如实现std::optional,但这个问题纯粹是出于好奇而提出的。
  • 好像有人在看C++ WAT
  • 我很确定 t.~T() 在模板中工作,处理通用上下文。不能说我能想到我想直接使用int 的情况。
  • 我标记为重复,因为哥伦布在他的回答中指出了这一点。 “您实际上不能为标量调用析构函数,因为它们没有析构函数(参见 §12.4)。该语句仅允许用于调用不知道类型的对象的析构函数的模板代码 -它消除了为标量类型编写专业化的必要性。” -- 我应该注意,为了准确起见,应该用 [class.dtor] 替换 12.4。

标签: c++ language-lawyer destructor c++17 primitive-types


【解决方案1】:

之所以有效,是因为语法没有为内置类型做出规定,但它确实为别名做出了规定:

[expr.post]/1:

postfix-expression:
    postfix-expression . pseudo-destructor-name
    postfix-expression -> pseudo-destructor-name

pseudo-destructor-name:
    ~ type-name
    ~ decltype-specifier

还有[dcl.type.simple]/1

type-name:
  class-name
  enum-name
  typedef-name
  simple-template-id

您可以想象type-name 下的每个变量代表什么。对于手头的情况,[expr.pseudo]/1 指定它只是一个void 表达式:

在点之后使用伪析构函数名称。或箭头 -> 运算符 表示 由 type-name 表示的非类类型的析构函数 或 decltype 说明符。结果只能用作操作数 对于函数调用操作符(),这样调用的结果有 键入无效。唯一的效果是评估后缀表达式 在点或箭头之前。

需要注意的有趣的事情是,您应该能够在没有别名的情况下执行此操作(如果您有一个命名对象),因为伪析构函数调用也适用于 decltype 说明符:

auto a = int{1};
a.~decltype(a)();

【讨论】:

  • 最后一个 sn-p 不能为 gcc 编译(“'decltype' 之前的预期标识符”),但为 clang 编译。根据您的理由,这是 gcc 中继中的错误/限制吗?相关:对于这个例子的具体情况(int),我们可以使用(明显的)事实,即应用于整数文字的decltype 说明符产生类型int,来构造int{1}.~decltype(0)();,它可以用clang 编译。此外,特别是,int{1}.~decltype(auto)(); 会崩溃,提示我们提交错误报告。例如自定义 POD FooFoo{1}.~decltype(auto)(); 不会崩溃,但会产生错误。
  • @dfri - 标准的干货表明作为 GCC 中的错误,是的。并且它应该被修复,因为构造是合法的。至于 Clang 中的崩溃……这是一个极端情况,我不确定是否值得报告错误。
  • 谢谢。至于 clang 崩溃,我同意,如果为它发布错误报告会觉得很傻。
猜你喜欢
  • 2013-11-23
  • 2013-09-04
  • 2018-08-22
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2021-06-21
  • 2018-05-24
相关资源
最近更新 更多