【问题标题】:Why does comma expression not work as expected when used as the placement argument?为什么逗号表达式在用作放置参数时不能按预期工作?
【发布时间】:2013-10-03 05:44:42
【问题描述】:
#include <new>

using namespace std;

void f(void*)
{}

struct A
{};

int main()
{
    A a;

    f((a.~A(), &a)); // OK
    new (&a) A();    // OK

    new ((a.~A(), &a)) A(); // error C2059: syntax error : 'type'
}

我认为 (a.~A(), &a) 是一个可以计算为指针值的有效表达式,所以它应该被接受为放置参数,为什么结果不是这样?

我的编译器是 VC++ 2013 RC。这是编译器错误吗?

更新:

我向connect.microsoft.com提出了一个错误

【问题讨论】:

  • 对我来说似乎是个错误。

标签: c++ visual-c++ compiler-errors expression standards


【解决方案1】:

是的,是编译器的bug,语法是正确的。

可以看一下标准中的语法:

new-placement:
( expression-list )

而且,a.~A(), &amp;a 作为表达式列表是有效的。

【讨论】:

  • 我认为您误解了正在发生的事情。 new 得到一个参数:两个表达式用逗号分隔并用括号括起来。但是,不接受它仍然是一个编译器错误。 (我不确定获取死对象地址的有效性。)
  • @CTMacUser:获取已死对象或尚未构造的对象的地址是有效的,尽管您可以对此类地址执行的操作非常有限,因为任何取消引用它的尝试都是未定义的行为。跨度>
  • @CTMacUser:是的,逗号运算符就是这样工作的,但它作为语法错误失败,所以它根本不评估操作数。
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2021-05-30
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多