在模板上下文中通过引用传递的参数的"const"限定符的位置
The position of 'const' qualifier of a parameter which is passed by reference in template context
考虑以下两个原型:
template<class T>
void whatever1(const T& something);
template<class T>
void whatever2(T const& something);
它们都是相同的。但是,如果T
不是通常的类型,而是指针类型呢?例如,让T
Somewhere*
然后whatever1
,whatever2
会有不同的解释:
// nonconst pointer (passed by reference) to const object
void whatever1(const Somewhere*& something);
// const pointer (passed by reference) to nonconst object
void whatever2(Somewhere* const& something);
在这种情况下,我可以推断以下属性:
1 whatever1
:
a) 可以修改内部something
,这些更改会传播到外部;
b) something
指向的对象不能被修改。
2 whatever2
:
a) 不能修改内部something
,因此外部安全;
b)something
指向的对象可以修改。
通常const
和&
一起使用,以避免在传递参数时复制,并同时保护此参数不被修改。那么就这种哲学而言,只有whatever2
发挥其作用。但是,如果我希望something
指向的对象也是不可修改的,那么两个都不合适!那会是什么呢?也许这个笑话:
template<class T>
void whatever3(const T const& something);
除了这种混乱之外,有些人使用whatever1
风格,而另一些人则使用whatever2
风格。根据经验,在创建泛型类和方法时应使用哪一个?
请注意,如果我们开始考虑Somewhere**
T
事情会变得更加混乱。
你的假设是错误的。当T = U *
时,T const &
和const T &
都是U * const &
,仅此而已。类似地,const T
和T const
都是U * const
的,当T = const W
时,T *
是W const *
或const W *
。(当然,这都受引用折叠规则的约束,因此假设U
和W
都不是引用类型)。
当模板实例化时,将 T 替换为 Somewhere* 不是文本模板 - 因此在这两种情况下,const 都将应用于指针,而不是它指向的东西。
不能以这种方式将const
限定符注入命名类型。 举个简单的例子,如果您有:
typedef int* P;
const P x;
那么x
是 int* const
型,而不是 const int*
型。 const
应用于整个P
类型,而不仅仅是P
类型的一部分。 这同样适用于模板类型参数。
如果要将const
限定符注入到类型中,可以毫不费力地执行此操作,例如,通过使用 remove_pointer
和 add_const
等类型特征。
它们都是相同的。但是,如果
T
不是通常的类型,而是指针类型呢?例如,让我们T
Somewhere*
然后whatever1
,whatever2
会有不同的解释:// nonconst pointer (passed by reference) to const object void whatever1(const Somewhere*& something); // const pointer (passed by reference) to nonconst object void whatever2(Somewhere* const& something);
不,实际上它不会void whatever1(const Somewhere*& something);
,它会在无效的类似C++的代码中void whatever1(const (Somewhere*)& something);
。写它C++方法是你的whatever2
,但它们的意思是一样的。
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 'HMODULE LoadLibraryA(LPCSTR)':无法将参数 1 从 'const _Elem *' 转换为 'LPCSTR'
- 将函数参数"const char*"转换为"std::string_view"是
- 将参数传递为"const"的奇怪效果
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- std::span<const T> 作为函数模板中的参数
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 何时应在构造函数参数中使用 const C++?
- 不允许运算符 const 参数调用 const 成员函数
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 知道模板参数在编译时是否为 const char*?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 具有参数 (const T *&) 或 (T * &) 或 (const T * const &) 或 (T * const &) 的方法
- 为什么在函数参数前面添加 const 会出错?
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 什么..表示函数内部参数(const char*值,..)
- 如果参数创建本地副本,则使用参数"const [variable_type] &"的目的是什么?
- 候选函数不可行:第一个参数('const Node *')将失去常量限定符