const变量是否可以在具有默认值的参数中赋值(作为可选参数)
Can a const variable be assigned in parameters with a default value (as an optional parameter)?
我需要在程序中大多数函数调用的末尾添加可选参数。现在,函数的参数看起来像
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);
}
这显然是有效和合法的,附带条件是,虽然在技术上允许将nullptr
或NULL
分配给std::unique_ptr
,但这可能是一种糟糕的做法,因为在其他方面不允许将原始指针直接分配给智能指针(即std::unique_ptr<int> ptr = new int(5);
不会编译(。
这样写可能更好:
foo(int a, char b, const unique_ptr c = {});
相关文章:
- C++ 通过自定义赋值运算符隐式转换函数参数
- 对函数的 out 字符串参数使用 swap 与赋值
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 用于赋值的参数化构造函数
- 为什么SDL_QueryTexture不为其 int* 参数赋值?
- 我可以防止参数隐式转换为赋值运算符吗?
- 将函数赋值给函数指针,常量参数正确性
- 使用 const ref 参数进行自赋值的行为
- 为什么在函数参数中使用赋值运算符会失败
- 为什么参数可以在对象初始化时通过赋值运算符传递给构造函数?
- 带有非类型参数的C++模板类:如何重载赋值运算符
- 哪些规则控制参数默认赋值?
- 当 std::initializer_list 用作赋值参数时,为什么它不是引用类型?
- 通过ctor-rvale参数进行Lambda赋值
- 实际参数列表中的赋值运算符
- 带有右值引用参数的模板赋值运算符与 vs2013 和 gcc 的行为不同
- 使用变量参数列表为传递的引用赋值(VS2010中出错)
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- 在将抽象基类作为参数的函数中将指针和赋值运算符与派生类一起使用
- 模板类赋值运算符中的模板参数