数组和指针作为函数参数出现,只是作为声明

Array and pointer appeared as a function parameter and just as a declaration

函数在 presence/absence cv 中的不同这一事实让我有点困惑 - 限定符是等价的 N4296::13.1/3.4 [over.load]:

Parameter declarations that differ only in the presence or absence of const and/or volatile are equivalent.

示例:

#include <iostream>

void foo(int){ }

void foo(const int){ } //error: redifinition

int main(){ }

DEMO

现在,让我提供一个成员函数示例。

#include <iostream>

struct A
{
    A(){ }
    void foo(){ std::cout << "foo()" << std::endl; }
    void foo() const{ std::cout << "foo() const" << std::endl; }
};

A aa;
const A a;
int main(){ aa.foo(); a.foo(); }

DEMO

N4296::13.3.1/2 [over.match.funcs]

member function is considered to have an extra parameter, called the implicit object parameter, which represents the object for which the member function has been called

因此,成员函数声明仅在存在 const 限定符时有所不同,但它们仍然是可重载的。这与我之前提供的 N4296::13.1/3.4 [over.load] 的引用不矛盾吗?

有一个巨大的 difference.Const 成员函数意味着您不能修改该函数中的数据。它包含在函数签名中 这就是编译器的方式 differentiates.Also根据 C++ FAQ

The trailing const on foo() member function means that the abstract (client-visible) state of the object isn't going to change. This is slightly different from promising that the "raw bits" of the object's struct aren't going to change. C++ compilers aren't allowed to take the "bitwise" interpretation unless they can solve the aliasing problem, which normally can't be solved (i.e., a non-const alias could exist which could modify the state of the object).

    #include <iostream>

    struct A
    {
        A(){var=0; }
        void foo(){ std::cout << "foo()" << std::endl; }
        void foo() const{ std::cout << "foo() const" << std::endl;var=5; } //this will generate error

        private:
        int var;
    };



A aa;
const A a;
int main(){ aa.foo(); a.foo(); }

我们会得到错误:只读变量不可赋值

看到这个http://coliru.stacked-crooked.com/

引用的段落(免责声明:我没有检查引用或归属,但无论如何,这个属性 of C++)是关于顶级const(和volatile)进行正式辩论。

例如,

void foo( const int x );

相当于

void foo( int x );

关于调用、检查其类型等。这是因为对于调用者来说,正式参数是否为 const 是没有任何关系的。 const-ness 只是对函数本身可以做什么的限制,而不是调用者可以做什么。

所以对于 void foo( int ) 你可以提供一个实现 const:

void foo( const int x ) { cout << x << endl; }

它实现了 void foo( int ) 因为它们是等价的。

对于 const 成员函数,您是在说 this 的指代是 const。那不是顶级 const。添加 const 大致相当于更改

void bar( int* p );

进入

void bar( const int* p );

这是两个不同的函数。