【发布时间】:2020-12-24 09:41:27
【问题描述】:
我有以下课程
template<class T> class CT
{
T& operator()(int i,int j) const noexcept
{ return indx[i*N+j]; }
private:
T *indx;
int N;
};
现在在我的应用程序的某些地方,我有以下内容
CT<double> arr, (...);
(...)
decltype(arr) *alias;
if(usearr)alias = &arr;
(...)
alias(0,0) = 3.0; // Compiler ERROR!
编译器抱怨我通过decltype 访问的对象类型不是函数或函数指针。
如果我在声明alias中删除指针并将该行替换为赋值重载,则问题可以解决
decltype(arr) alias;
if(usearr)alias = arr;
前一种方法有什么问题?
【问题讨论】:
-
您的代码有语法错误。应该是
operator()(<params>)。如果您按值获取参数,则无需申请const。最后,展示完整的代码,而不是让每个人都猜测...中的内容。 -
这并没有解决问题,但是当
alias被创建时,它有一个未指定的值。如果代码没有为其分配真实地址或空指针,那么它对alias所做的任何事情都会引入未定义的行为。更合适的初始化可能是decltype(arr) *alias = usearr ? &arr : nullptr;。
标签: c++ c++11 pointers decltype