gpt4 book ai didi

c++ - 我如何告诉 clang-tidy 切片特定的类是可以的?

转载 作者:行者123 更新时间:2023-12-01 14:48:51 26 4
gpt4 key购买 nike

我有一个类Point从另一个类公开继承的 Vec3并添加一些数据成员。例如,当询问样条曲线的坐标时,返回的额外数据可能是最近控制点的索引。一个要求是不关心 Point 中的额外数据的用户应该可以像使用 Vec3 一样使用它.

Point spline(double distance);
Vec3 position = spline(0.4);

从语言规范的角度来看,这按预期工作,但我们最近合并了 clang-tidy 并给出以下警告:
error: slicing object from type 'Point' to 'Vec3' discards 4 bytes of state [cppcoreguidelines-slicing

这是真的,我希望在一般情况下启用该检查,但是 有什么方法可以告诉 clang-tidy 切片 PointVec3没问题 ?

我尝试添加 operator Vec3()Point希望它会选择切片,但显然在转换为基类时从未使用过转换函数:

[class.conv.fct]
A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void



class.conv.fct

强调我的。

一个小例子:

struct Vec3 {
double x, y, z;
};

struct Point : public Vec3 {
int control;
operator Vec3() { return Vec3 {x, y, z}; } // This does nothing.
};

Point spline(double distance)
{
return Point {distance, 0.0, 0.0, 0};
};

int main()
{
Vec3 point = spline(0.1);
}
main.cpp:7:5: error: conversion function converting 'Point' to its base class 'Vec3' will never be used [clang-diagnostic-warning,-warnings-as-errors]
operator Vec3() { return Vec3 {x, y, z}; } // This does nothing.
^
main.cpp:17:18: error: slicing object from type 'Point' to 'Vec3' discards 4 bytes of state [cppcoreguidelines-slicing,-warnings-as-errors]
Vec3 point = spline(0.1);

最佳答案

clang-tidy slicing flag基于 C++ 核心指南,它们链接到 the exact section .在这里,您可以获得指南的推理以及切片时的替代方案:

Alternative

If you mean to slice, define an explicit operation to do so. This saves readers from confusion.



在你的例子中,你可以是这样的:
struct Point : public Vec3 {
int control;
Vec3 copy_as_vec3() { return Vec3 {x, y, z}; }
};

关于c++ - 我如何告诉 clang-tidy 切片特定的类是可以的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59867852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com