指向成员函数的指针是什么原因,不能指向const成员函数?
struct A {
void g() {};
void f() const {}
};
Run Code Online (Sandbox Code Playgroud)
后来的代码:
void (A::* fun)() = &A::f;
Run Code Online (Sandbox Code Playgroud)
此代码生成:
error: cannot convert ‘void (A::*)()const’ to ‘void (A::*)()’ in initialization
Run Code Online (Sandbox Code Playgroud)
当然它编译&A::g
而不是&A::f
.
相反的情况:
void (A::* fun)() const = &A::g;
Run Code Online (Sandbox Code Playgroud)
错误是:
error: cannot convert ‘void (A::*)()’ to ‘void (A::*)()const’ in initialization
Run Code Online (Sandbox Code Playgroud)
第二种情况相当清楚.const
指针不应该修改对象,因此它不能保存执行它的功能.但是为什么不能像第一种情况那样将const
成员函数分配给成员函数non-const
?
它看起来像正常的指针,其中铸造规则const
,以non-const
允许修改的价值,但我不认为这里的点,其中常量,正确性在函数定义检查,这样的分配之前.
我想numpy.ndindex
在 C++ 中实现等效的。它应该为指定维度的多维数组生成索引。
这是二维数组的实现。
template <typename T>
inline auto NDIndex(T d0, T d1) {
using namespace ranges;
return views::cartesian_product(views::indices(d0), views::indices(d1));
}
// Usage
for (const auto[i1, i2] : NDIndex(5, 4)) {
arr[i1][i2] = ...
}
Run Code Online (Sandbox Code Playgroud)
我想在不牺牲性能的情况下将其概括为任意数量的维度。我可以在界面中使用大括号,例如NDIndex({5, 4})
. 我可以想到多种解决方案,但我不确定哪个可以静态解决这个问题。
可以强制&mut T
进入,&T
但如果类型不匹配发生在类型构造函数中,则它不起作用。
use ndarray::*; // 0.13.0
fn print(a: &ArrayView1<i32>) {
println!("{:?}", a);
}
pub fn test() {
let mut x = array![1i32, 2, 3];
print(&x.view_mut());
}
Run Code Online (Sandbox Code Playgroud)
对于上面的代码,我收到以下错误:
|
9 | print(&x.view_mut());
| ^^^^^^^^^^^^^ types differ in mutability
|
= note: expected reference `&ndarray::ArrayBase<ndarray::ViewRepr<&i32>, ndarray::dimension::dim::Dim<[usize; 1]>>`
found reference `&ndarray::ArrayBase<ndarray::ViewRepr<&mut i32>, ndarray::dimension::dim::Dim<[usize; 1]>>`
Run Code Online (Sandbox Code Playgroud)
强制&mut i32
执行是安全的,&i32
那么为什么在这种情况下不适用呢?你能否提供一些例子说明它怎么可能适得其反?
毫无疑问,异常是有用的,因为它们向程序员显示他正在使用不正确的函数或者在环境中发生了一些不好的事情但是真的需要捕获它们吗?
未捕获的异常正在终止程序,但您仍然可以看到问题所在.在设计良好的库中,每个"意外"情况实际上都有解决方法.例如,使用map::find
而不是map::at
检查你的int变量是否小于vector::size
使用索引运算符之前的变量.
为什么有人需要这样做(不包括使用强制执行它的库的人)?基本上,如果您正在为给定的异常编写处理程序,那么您也可以编写一个代码来防止它发生.
假设我有一个没有参数的构造函数的类,以及它的对象的STL容器:list<Object> lst;
有没有办法在适当的位置插入新对象?
我知道类似的东西lst.push_back(Object());
会起作用,同样快速,因为它会使用移动构造函数,但似乎有点奇怪的是,没有任何函数可以简单地在列表的末尾创建新对象而没有任何参数,而已经存在安装那可能适合那个地方.
请问,如果实际上不可能,请提供一些解释?