C++ 中对 const Callable 的引用和对 Callable 的引用之间的区别
Difference between Reference to a const Callable and Reference to a Callable in C++
我想知道如果我们有一个引用 const
函数的函数参数会发生什么,如下所示。
版本 1
int anotherFunc()
{
std::cout<<"inside anotherFunc"<<std::endl;
return 5;
}
void func(decltype(anotherFunc) const &someFunction)//note the const here
{
std::cout<<"inside func"<<std::endl;
std::cout<<someFunction()<<std::endl;
}
int main()
{
std::cout << "Hello World" << std::endl;
func(anotherFunc);
return 0;
}
版本 2
int anotherFunc()
{
std::cout<<"inside anotherFunc"<<std::endl;
return 5;
}
void func(decltype(anotherFunc) &someFunction)//note the missing const here
{
std::cout<<"inside func"<<std::endl;
std::cout<<someFunction()<<std::endl;
}
int main()
{
std::cout << "Hello World" << std::endl;
func(anotherFunc);
return 0;
}
我的问题是:
- 版本1和版本2在函数
func
的函数参数someFunction
上是否完全等价?那就是为函数参数 someFunction
添加 const
什么都不做(即简单地忽略)。
- 如果在这些示例中忽略
const
,那么 C++ 标准在什么时候(文档)指定在这种情况下将忽略 const
。
PS:查看生成的程序集,似乎忽略了 const
以引用函数参数。
- Are version 1 and version 2 completely equivalent in terms of the function parameter someFunction of the function func?
是的。没有诸如 const 限定函数类型之类的东西,因此也没有诸如对 const 函数的引用之类的东西。如果您要将 const 应用于对函数类型的显式书面引用,那么该程序将是病式的。但是当 const 应用于类型别名或类型推导时,const 将被忽略。
- does the C++ standard specify that const will be ignored for this case.
是的。
是的,const
限定符在添加到函数类型的别名时会被忽略。
根据标准,[dcl.fct]/7:
The effect of a cv-qualifier-seq in a function declarator is not the same as adding cv-qualification on top of the function type. In the latter case, the cv-qualifiers are ignored.
[Note 4: A function type that has a cv-qualifier-seq is not a cv-qualified type; there are no cv-qualified function types. — end note]
[Example 4:
typedef void F();
struct S {
const F f; // OK: equivalent to: void f();
};
— end example]
我想知道如果我们有一个引用 const
函数的函数参数会发生什么,如下所示。
版本 1
int anotherFunc()
{
std::cout<<"inside anotherFunc"<<std::endl;
return 5;
}
void func(decltype(anotherFunc) const &someFunction)//note the const here
{
std::cout<<"inside func"<<std::endl;
std::cout<<someFunction()<<std::endl;
}
int main()
{
std::cout << "Hello World" << std::endl;
func(anotherFunc);
return 0;
}
版本 2
int anotherFunc()
{
std::cout<<"inside anotherFunc"<<std::endl;
return 5;
}
void func(decltype(anotherFunc) &someFunction)//note the missing const here
{
std::cout<<"inside func"<<std::endl;
std::cout<<someFunction()<<std::endl;
}
int main()
{
std::cout << "Hello World" << std::endl;
func(anotherFunc);
return 0;
}
我的问题是:
- 版本1和版本2在函数
func
的函数参数someFunction
上是否完全等价?那就是为函数参数someFunction
添加const
什么都不做(即简单地忽略)。 - 如果在这些示例中忽略
const
,那么 C++ 标准在什么时候(文档)指定在这种情况下将忽略const
。
PS:查看生成的程序集,似乎忽略了 const
以引用函数参数。
- Are version 1 and version 2 completely equivalent in terms of the function parameter someFunction of the function func?
是的。没有诸如 const 限定函数类型之类的东西,因此也没有诸如对 const 函数的引用之类的东西。如果您要将 const 应用于对函数类型的显式书面引用,那么该程序将是病式的。但是当 const 应用于类型别名或类型推导时,const 将被忽略。
- does the C++ standard specify that const will be ignored for this case.
是的。
是的,const
限定符在添加到函数类型的别名时会被忽略。
根据标准,[dcl.fct]/7:
The effect of a cv-qualifier-seq in a function declarator is not the same as adding cv-qualification on top of the function type. In the latter case, the cv-qualifiers are ignored.
[Note 4: A function type that has a cv-qualifier-seq is not a cv-qualified type; there are no cv-qualified function types. — end note]
[Example 4:typedef void F(); struct S { const F f; // OK: equivalent to: void f(); };
— end example]