GCC中C++17参数传递匹配C++14提示的触发原因及影响咨询
关于GCC C++17下参数传递提示的疑问
在Linux ARM 64位平台使用GCC 11.2编译器、启用C++17标准编译代码时,收到提示:C++17启用时Color类型参数传递改为匹配C++14。
示例代码如下:
#include <iostream> class C {}; // Must inherit to produce the note mentioned below. class Color : C { public: double x={1.0}, y={2.0}, z={3.0}; Color() = default; // Copy constructor. // Default - gives note: parameter passing for argument of type 'rgb_color' when C++17 is enabled changed to match C++14 in GCC 10.1 warning. Color(const Color& other) = default; // Explicit - does NOT give the note //Color(const Color& other): C(other),x(other.x),y(other.y),z(other.z){} }; void a(Color c) { std::cout << c.x; } int main (){ Color c{}; a(c); }
疑问点
- 为何必须继承基类、使用默认拷贝构造函数才会触发该提示?
- 此问题需要引起多大重视?
解答
1. 触发提示的原因
这个提示和GCC对C++17标准中**保证拷贝省略(Guaranteed Copy Elision)**的兼容调整直接相关:
- C17之前,函数传值时类对象会先拷贝到临时对象,再传递给函数参数;C17的保证省略允许直接在参数位置构造对象,跳过临时拷贝步骤。
- 当类继承了基类(哪怕是private继承)且使用默认拷贝构造函数时,GCC判定这类对象的拷贝逻辑依赖基类的隐式操作,若直接应用C17的保证省略,可能破坏旧代码的预期行为。因此GCC会恢复到C14的参数传递方式(保留临时拷贝),并给出提示说明这个兼容调整。
- 如果是用户显式定义拷贝构造函数,GCC认为用户已完全掌控拷贝逻辑,不需要自动调整传递方式,因此不会触发提示;如果类没有继承基类,默认拷贝构造是平凡的,保证省略可以安全应用,不存在兼容问题,也不会触发提示。
2. 重视程度评估
这个提示属于兼容性告知,而非错误:
- 它不会导致程序崩溃或逻辑错误,只是GCC为兼容C14旧行为,暂时跳过了C17的拷贝省略优化,带来的影响最多是轻微的性能损耗(多一次对象拷贝)。
- 只有当程序对性能极度敏感(比如高频调用的函数传递这类对象)时,才需要考虑通过显式定义拷贝构造、调整继承结构等方式消除提示;普通场景下完全可以忽略这个提示,不影响代码正常运行。
内容的提问来源于stack exchange,提问作者User 10482
相关产品推荐
相关产品推荐

