BЈо*_*вић 5 c++ language-lawyer
今天我发现可以在带有一个签名的头文件中声明一个函数,并在具有不同(相似)签名的源文件中实现它.例如,像这样:
// THE HEADER example.hpp
#ifndef EXAMPLE_HPP
#define EXAMPLE_HPP
int foo( const int v );
#endif
// THE SOURCE FILE example.cpp
#include "example.hpp"
int foo( int v ) // missing const
{
return ++v;
}
Run Code Online (Sandbox Code Playgroud)
这是允许的吗?或者这是编译器的扩展(我使用的是g ++ 4.3.0)?
编辑 我正在编写迂腐和最大可能的警告级别,我仍然没有收到警告或错误.
CB *_*ley 12
出于确定函数签名的目的,将忽略任何顶级 const
限定符.这是因为它不会影响函数调用者.函数参数在任何情况下都按值传递,因此函数不会影响传入的参数.
顶级const
确实会影响函数的主体.它确定是否可以在函数体中更改参数.它与声明的功能相同.
所以是的,它是合法的,声明和定义指的是相同的功能而不是重载.
标准参考:8.3.5 [dcl.fct]/3:"[...]使用以下规则确定函数的类型.[...] 删除修改参数类型的任何cv限定符.[. ..]这样的cv限定符只影响函数体内参数的定义;它们不影响函数类型.[...]"
由于int是基本值类型,因此const修饰符在此处没有任何效果.无论你对函数中的int做了什么,调用者都不会看到它.
你无法用int&做到这一点.在这种情况下,const的存在与否实际上与调用者相关,因为可以修改所引用的int.
归档时间: |
|
查看次数: |
817 次 |
最近记录: |