gpt4 book ai didi

c++ - 在 clang++ 中按值怪异传递抽象对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:33 25 4
gpt4 key购买 nike

为什么 clang++ 3.6 编译了下面的代码(g++ 没有)?

class Abc
{
public:
virtual void foo() const = 0;
virtual ~Abc() {}
};

// is correctly rejected
// void bar(Abc o)
// {
// }

class B
{
void bar(Abc o) // should also be rejected
{
}

};

int main()
{
}

我使用的是 clang 3.6 和 gcc 4.9.2。

为什么自由函数(正确地)被拒绝而成员函数却没有?

有什么提示吗? clang 中的错误?

如果我将上面的修改为:

class Abc
{
public:
virtual void foo() const = 0;
virtual ~Abc() {}
};
class Impl : public Abc {
public:
void foo() const {}
};
class B
{
public:
void bar(Abc o)
{
o.foo();
}
};
int main()
{
B b;
Impl i;
b.bar(i);
}

我得到一个

main.cc:16: 对 `Abc::foo() const' 的 undefined reference

链接器错误。

所以问题是:为什么允许 clang++ 编译这个错误的代码?我会说这是一个严重的错误!

最佳答案

作为 N4296 10.4 [class.abstract]说:

An abstract class shall not be used as a parameter type, as a function return type, or as the type of an explicit conversion. Pointers and references to an abstract class can be declared.

[ Example:
shape x;// error: object of abstract class
shape* p;// OK
shape f();// error
void g(shape);// error
shape& h(shape&);//OK
— end example ]

所以gcc遵循标准。

为什么不能将参数声明为抽象类型?假设当一个子类对象传递给bar时,发生了对象切片,哦,一个具有纯虚函数的对象......这是一个矛盾。这可能是原因。

编辑:

为什么 clang 会通过,这是 clang 编译器的问题。

关于c++ - 在 clang++ 中按值怪异传递抽象对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29295754/

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