当前位置: 首页 > 知识库问答 >
问题:

在括号内的lambda中声明名为“this”的变量会在3个不同的编译器上产生不同的结果

柯立果
2023-03-14
struct B;
struct A
{
  A (B *) {}
};

struct B 
{
  B ()
  {
    [this] { A (this); } ();
  }
};

共有1个答案

充修能
2023-03-14

在C标准5.1.5中(C 11的第7条,后面的第8条标准)[expr . primλ]:

lambda表达式的复合语句产生函数调用操作符的函数体(8.4),但是为了名称查找(3.4)、确定this(9.2.2.1)的类型和值以及使用(*this) (9.2.2)将引用非静态类成员的id表达式转换成类成员访问表达式,复合语句被考虑在lambda表达式的上下文中。[示例:

struct S1 {
  int x, y;
  int operator()(int);
  void f() {
    [=]()->int {
      return operator()(this->x + y); // equivalent to S1::operator()(this->x + (*this).y)
                                      // this has type S1*
               };
  }
};

—示例结束]

因此,海湾合作委员会是正确的。您会注意到,您正在捕获此内容的事实也不例外。然而,它们是自C 14以来的精度,在你捕获*this的情况下,仍然在§5.1.5(第17条):

如果*this是通过copy捕获的,则每次odr使用this时,都会将其转换为一个指向闭包类型的相应未命名数据成员的指针,并将其转换为this的类型(5.4)。

 类似资料:
  • 这是代码: 如果我在我的机器()或这里()上尝试: 相反,这里(): 这是不同的。这是由于机器厄普西隆?还是编译器精度标志?还是不同的评估? 造成这种漂移的原因是什么?问题似乎出现在函数中(因为其他值似乎相同)。

  • 问题内容: 给定相同的主要版本,例如Java 7,不同的Java编译器(例如Oracle的热点,JRockit或IBM的J9等)是否将给定的Java源代码文件编译为相同的bytcode? 扫描Java 7语言规范 ,似乎正在讨论的是语言的语义,而不是代码到字节码的转换。 YES 。 以上摘录为: JLS留下了许多实现细节,因一个实现而异。 和 但是,JLS没有指定从源代码到生成的字节码的1:1映射

  • 我在JavaScript中创建一个非常基本的对象,并循环通过其属性,显示属性名称: 在IE和FireFox中,它会产生预期的结果: 但在Chrome中,同样的代码会产生 知道为什么吗?关键词在Chrome中是否具有某种意义?

  • 上面的代码使用不同的编译器会有不同的结果。这是编译器的错误还是我漏掉了什么? 叮叮当当 1 1 (https://godbolt.org/z/s43T55rxq) msvc 1 1 (https://godbolt.org/z/YnKfKh41q) 全球循环 0 1 (https://godbolt.org/z/91xdfv93c)

  • 问题内容: 让我们看看Linux()中的功能: 让我们看看Mac()中的功能: 如您所见,这些声明彼此不同(参数顺序)。这真是令人惊讶!在某个地方抱怨解决这个问题是否有效? 问题答案: 在某个地方抱怨解决这个问题是否有效? las,不。这种方式已经存在了很长时间,并且有太多的代码依赖于此。 我认为根本的问题是“ 为什么会发生这些不兼容 ”?我会回答。它似乎可以归结为BSD首先实现它,但界面较差。I

  • 当我跑的时候。使用CPLEX的NET 4应用程序,我在不同的机器上得到不同的输出。在我的开发机器上,CPLEX输出一个结果(异常并卡在某个大值上),在所有其他机器上,结果都可以。 首先,我认为它与操作系统有关,因为我的开发机器上同时有视窗7 x64和视窗8 x64,所以我尝试在两个系统上运行应用程序。结果是一样的——有缺陷。 然后我试着在两台不同的台式机上运行,效果很好。我甚至在虚拟机内部进行了尝