You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compiler Explorer MSVC下试验C++23特性的运行问题咨询

问题根因说明

你对无输出问题的推测只对了一半:

  1. 第一行my_vector{3,1,4,1,5,9,2,6,5}.sorted_by(less_than());构造的临时对象、排序后返回的临时副本,确实会在整行语句执行结束后立刻销毁,没有被任何变量持久持有。
  2. 但你后续范围for循环遍历的并不是这个已销毁对象的悬空引用:你自行添加的operator()()是完全多余的代码——继承自std::vector的my_vector本身就自带begin()/end()迭代器接口,原生支持范围for循环。你写出my_vector()时,实际语义是「默认构造一个全新的空my_vector临时对象,再调用operator()()返回这个空对象的自身引用」,遍历的是一个从创建开始就没有任何元素的空容器,自然不会有内容输出。

你为兼容编译器做的第二处调整(显式调用operator()传入less_than实例)是当前编译器对新特性实现不完整导致的临时方案,不属于标准要求的写法。

可运行修正代码

移除多余的operator()(),用局部变量持有排序后返回的对象以延长其生命周期即可:

#include <iostream>
#include <vector>
#include <algorithm>

struct less_than {
    template<typename T, typename U>
    bool operator()(this less_than, const T& lhs, const U& rhs) {
        return lhs < rhs;
    }
};

struct my_vector : std::vector<int> {
    using std::vector<int>::vector;

    auto sorted_by(this my_vector self, auto comp) -> my_vector {
        std::sort(self.begin(), self.end(), comp);
        return self;
    }
};

int main() {
    // 持有排序结果,避免临时对象立刻销毁
    auto sorted_nums = my_vector{3,1,4,1,5,9,2,6,5}.sorted_by(less_than{});

    for (auto v : sorted_nums) {
        std::cout << v << " ";
    }

    return 0;
}

编译运行后会正常输出排序结果:1 1 2 3 4 5 5 6 9

C++23 显式this参数(Deducing This)特性说明
  • 核心设计逻辑:传统C++成员函数的this指针是隐式参数,为了覆盖左值/右值、const/非const、volatile/非volatile等不同调用场景,往往需要编写多份逻辑完全一致的重载,代码冗余度很高。显式this参数把隐式的this变成成员函数的第一个显式形参,编译器会根据调用者的值类别、修饰属性自动推导形参类型,一份实现就能覆盖所有场景,大幅简化代码。你看到的按值this实现移动链的用法,就是利用了「右值调用时按值传参会自动触发移动构造,不需要额外写右值引用重载」的特性,链式调用过程中可以无拷贝地传递中间临时对象的资源,比传统写法更简洁高效。
  • 当前编译器实现状态:目前MSVC、GCC、Clang对该特性的支持都还处于适配阶段,部分边缘场景存在实现缺陷,你遇到的需要显式调用函数对象operator()才能编译通过的问题,就是当前MSVC版本的实现bug,不是C++23标准的语法要求。
  • 后续发展:该特性已经正式纳入C23标准特性列表,核心语法不会再发生调整,后续各编译器只会逐步补全实现、修复兼容问题,预计在C23标准正式发布后1-2年,各主流编译器就能达到生产可用的稳定支持状态。

内容的提问来源于stack exchange,提问作者Francis Cugler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:51:28