【发布时间】:2017-10-03 12:54:39
【问题描述】:
#include <iostream>
using namespace std;
template<typename T>
void f(T&&) { cout << "f(T&&)" << endl; }
template<typename T>
void f(const T&&) { cout << "f(const T&&)" << endl; }
struct A {};
const A g1() { return {}; }
const int g2() { return {}; }
int main()
{
f(g1()); // outputs "f(const T&&)" as expected.
f(g2()); // outputs "f(T&&)" not as expected.
}
问题描述嵌入在代码中。我的编译器是clang 5.0。
我只是想知道:
在这种情况下,为什么 C++ 会以不同的方式对待内置类型和自定义类型?
【问题讨论】:
-
clang编译警告
warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers] -
如果构建代码并启用所有警告(
-Wall -Wextraon gcc),这些问题本可以避免。 -
@JonasWielicki:出于向后兼容性的原因,这不会启用所有警告,这就是 Clang 引入
-Weverything的原因:) -
@JonasWielicki:基本上,GCC 没有等价物。粗略地说 GCC
-Wall打开所有在引入时存在的警告,但没有任何新警告,因为担心这会阻止使用-Wall -Werror的第三方软件的人升级 GCC(这是一个非常有效的担忧,我不应该,看到 GCC 用于构建许多 Linux 发行版)。后来他们添加了-Wextra来覆盖丢失的警告集,并且出于同样的原因它被稳定了,因此不包括之后包含的警告...... -
@MatthieuM。 GCC确实不时添加到
-Wall和-Wextra;-Wall的实际政策类似于“几乎可以肯定表明存在错误,即使没有,也可以轻松更改代码以消除警告”,-Wextra的实际政策类似,但估计的指示几率较低一个错误。您可能已经注意到,clang 的-Weverything包含警告,如果代码按原样正确,则没有解决方法 - 这是 GCC 人们想要避免的。
标签: c++ c++11 overloading standards overload-resolution