在const lambda 对象上调用非常量operator()

问题描述 投票:0回答:1

考虑以下代码片段(demo):

const auto lambda = [] () mutable {};
using Lambda = decltype(lambda);

static_assert(!std::is_function_v<Lambda>);
static_assert(std::is_class_v<Lambda>);
void (Lambda::*ptr)() = &Lambda::operator();  // operator() is not const

// Calling non-const method:
lambda();                                     // SURPRISE: this works
// lambda.operator()();                       // error: conversion loses qualifiers
  • 为什么
    lambda();
    行可以编译?
  • 如果我们在
    =
    []
    中添加
    lambda
    ,它不会编译。为什么这会有所不同?

注意,以下两种类型是相同的(demo):

class C;
using CC = const C;
static_assert(std::is_same_v<void (C::*)(), void (CC::*)()>);
c++ language-lawyer const-correctness
1个回答
0
投票

正如您在 cppinsights

中看到的那样
lambda();

将使用函数指针转换(即

const
)。

© www.soinside.com 2019 - 2024. All rights reserved.