C++ 返回指向意图(in)参数的指针

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和

我试图更好地理解C/C++中的
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++中不需要返回 const指针< /C> >,您可以简单地返回<代码> const引用< />代码。这是典型的getter实现,例如:

const方法意味着该方法不会修改实例属性

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;};