数组和指针作为函数参数出现,只是作为声明
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(){ }
现在,让我提供一个成员函数示例。
#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(); }
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(); }
我们会得到错误:只读变量不可赋值
引用的段落(免责声明:我没有检查引用或归属,但无论如何,这个属性 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 );
这是两个不同的函数。
函数在 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(){ }
现在,让我提供一个成员函数示例。
#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(); }
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(); }
我们会得到错误:只读变量不可赋值
引用的段落(免责声明:我没有检查引用或归属,但无论如何,这个属性 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 );
这是两个不同的函数。