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

C++中枚举作为默认引用参数触发VS2017编译错误的技术问询

问题分析与解决方案

先看你给出的代码:

class Schedule {
public:
    enum day{MON, TUE, WED, THU, FRI, SAT, SUN};
    void isWeekend(day &dayOfWeek=SUN); // 这里触发编译错误
};

你遇到的initial value of reference to non-const must be an lvalue错误,核心是C++的引用绑定规则限制,我给你拆解清楚:

为什么会报错?

当你调用isWeekend()不传入参数时,编译器会用默认值SUN生成一个临时的day类型对象——因为枚举值本身不是可修改的左值,传递时会创建临时副本。而你的函数参数是day &dayOfWeek,这是一个非const的左值引用,根据C++标准,这种引用只能绑定到可被修改的左值(比如已经定义好的变量),绝对不能绑定到临时对象(右值),所以编译器直接抛出错误。

为什么移除引用就正常了?

改成day dayOfWeek=SUN后是值传递:编译器会把临时对象的值拷贝到函数的参数dayOfWeek里,值传递本身就是处理临时对象的常规方式,自然不会有任何问题。

两种可行的修复方案

根据你的需求(获取day值、默认参数为SUN),可以选以下两种方式:

  1. 改用const左值引用(推荐,如果函数不需要修改传入的day值):

    void isWeekend(const day &dayOfWeek=SUN);
    

    const左值引用是C++专门设计用来绑定临时对象的,它既可以接收左值变量,也能接收临时对象,同时还能避免不必要的拷贝(虽然枚举类型拷贝开销极小,但这是更规范的写法)。

  2. 保持值传递:
    就是你已经尝试的写法void isWeekend(day dayOfWeek=SUN);,对于枚举这种轻量级类型来说,值传递完全没问题,代码简单直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:44:20