C++ 返回指向意图(in)参数的指针
我试图更好地理解C/C++中的C++ 返回指向意图(in)参数的指针,c++,pointers,fortran,language-lawyer,immutability,C++,Pointers,Fortran,Language Lawyer,Immutability,我试图更好地理解C/C++中的const与Fortran中类上下文中的intent(in)之间的区别 C++: 如果我将const隐式this参数返回给成员函数,并返回对this成员的引用,则这些引用必须是const T*。 因此,const不仅适用于函数调用的范围,还扩展到该函数调用中“创建”的所有引用 Fortran:如果我intent(in)成员函数的此参数,则intent(in)仅适用于成员函数的范围。我不能在成员函数内部变异此,但我可以返回一个引用并在外部修改此 如果在FORTRAN和
const
与Fortran中类上下文中的intent(in)
之间的区别
C++:
如果我将const
隐式this
参数返回给成员函数,并返回对this
成员的引用,则这些引用必须是const T*
。
因此,const
不仅适用于函数调用的范围,还扩展到该函数调用中“创建”的所有引用
Fortran:如果我intent(in)
成员函数的此
参数,则intent(in)
仅适用于成员函数的范围。我不能在成员函数内部变异此
,但我可以返回一个引用并在外部修改此
如果在FORTRAN和C++中有一个计数器类的代码,则测试结果是正确的。
#include <iostream>
class Counter {
int val{};
public:
auto next()
{
return val++;
};
const auto raw() const
{
const auto ptr = &val;
return ptr;
};
};
int main()
{
Counter c{};
std::cout << c.next() << "\n";
std::cout << c.next() << "\n";
auto ptr = c.raw();
// does not compile, as it is expected
*ptr = 0;
std::cout << c.next() << "\n";
return 0;
}
C++中不需要返回
class Counter {
int val{};
public:
auto next()
{
return val++;
};
const int &getVal const
{
return val;
};
};
在上述的例子中,吸气剂也可以返回一个Valk的拷贝(在这种情况下不需要返回一个const引用)。
< P>在阅读关于我的C++部分的评论和回答之后,咨询FORTRAN 2008标准,我想我可以回答我自己的问题: C++: 如果没有像const\u cast
这样的黑客技巧,就不可能创建T*
指针或T&
引用const T
类型的T
变量。指针/引用也必须指向const
。
因此:如果this
是成员函数的const
参数,则不允许返回非const
指针或引用
int& getVal() const {return val;};
两者都不会编译。因此,通过将this
声明为const
,我们可以为我们的成员提供只读访问权限。(感谢@Jean-Marc Volle,我将使用第一个版本。)
Fortran:
Fortran的根本问题是,没有指向const
(const T*
)的指针,只有const
指针(T*const
)。因此,不可能使用指向某一类型组件(C++中类的成员)的指针来提供只读访问。剩下的问题是const
和intent(in)
之间的差异,以及是否可能返回对intent(in)
对象(或其组件)的可能变异引用
在Fortran 2008标准5.3.10中
它说:
非指针伪参数的INTENT(IN)属性指定既不应定义也不应定义它
在过程的调用和执行过程中变为未定义。对象的INTENT(IN)属性
指针伪参数指定在调用和执行过程期间,其关联应
不能更改,除非如果目标不是通过指针解除分配,它可能会变得未定义
(16.5.2.5)
如果我正确解释了它,就不允许对
intent(in)
对象进行变异,但可以返回(可能的)变异引用。您可以从const
方法返回非常量引用/指针,但不能返回成员,因为它们是常量。问题是什么,如果我写的是对的,那么你基本上问了两个问题。C++代码是否正确,FORTRAN代码是否正确。除了一行C++代码看起来好,我不能说Fortran,上次我用它,它看起来完全。different@mcocdawc为了获得更多信息,我将您的问题转发给了更倾向于开放式问题和讨论的。我认为如果你也在那里添加评论,那将是非常棒的(这样读者也会更清楚地理解意图>,在上面的示例中,getter也可以返回val的副本。我知道,但我的成员实际上要大得多。5.3.10对于指针的含义是允许您更改指针目标的值,但不能更改指针为poi的地址对。
int& getVal() const {return val;};
int* getVal() const {return &val;};