const变量是否可以在具有默认值的参数中赋值(作为可选参数)

Can a const variable be assigned in parameters with a default value (as an optional parameter)?

本文关键字:参数 赋值 默认值 是否 变量 const      更新时间:2023-10-16

我需要在程序中大多数函数调用的末尾添加可选参数。现在,函数的参数看起来像

foo(int a, char b, const unique_ptr c)

我添加的是最后一个参数的默认值,使其可选,因此看起来像

foo(int a, char b, const unique_ptr c = NULL)

可以像我所做的那样在参数中分配常量变量吗?或者这违背了常变量的本质?

限定为const的变量可以初始化,但之后不能更改(例如分配给(。对于任何普通变量以及函数参数都是如此。让我们将您的示例简化为

void foo(const int a = 1) {}

这本身就是一个有效的函数签名,它告诉编译器参数a在函数体中没有被修改。因此不会编译:

void illegalFoo(const int a = 1) { a = 2; /* Error, won't compile */ }

如果调用代码将值传递给函数

foo(3);

在该示例中,函数参数a被初始化为3,但是在函数体中同样没有改变。同样的道理也适用于std::unique_ptr论点:

void foo(const std::unique_ptr<SomeClass> ptr = nullptr)
{
/* No way to alter ptr here */
}

但是,请注意,这个函数签名没有什么意义。通过值传递std::unique_ptr意味着转移所有权,但不能为了从中构造另一个拥有智能指针而将const限定的实例强制转换为右值引用。如果没有所有权语义与这样的函数相关联,则传递一个原始指针-它也可以被声明为const并默认为nullptr

您想要做的是重载您的函数,而不是在其原始定义中为参数添加默认值。重载一个函数如下:

void foo(int a, int b) {
// this is the original definition, takes 2 parameters, so we initialize c to 0:
const int c = 0;
return a + b;
}
// then, right underneath, you add an overloaded definition for the function:
void foo(int a, int b, const int c) {
// this is the overloaded definition, takes 3 parameters
return a + b + c;
}

这样,当您调用foo()时,参数c是完全可选的。

您所做的没有错。

请记住,此语法:

foo(int a, char b, const unique_ptr c = NULL);

基本上只是语法糖:

foo(int a, char b, const unique_ptr c);
foo(int a, char b) {
foo(a, b, NULL);
}

这显然是有效和合法的,附带条件是,虽然在技术上允许将nullptrNULL分配给std::unique_ptr,但这可能是一种糟糕的做法,因为在其他方面不允许将原始指针直接分配给智能指针(即std::unique_ptr<int> ptr = new int(5);不会编译(。

这样写可能更好:

foo(int a, char b, const unique_ptr c = {});