我读到过,要使自定义容器与基于范围的 for 循环配合使用,“事物”需要位于同一命名空间中。哪些事物需要位于同一命名空间中?begin-end 自由函数及其返回的迭代器?还是 begin-end 函数和传递给它们的容器?
Newline's questions
我正在开发一个基本的游戏引擎,一直遵循建议只包含我需要的东西。我注意到,在某些地方,我包含了大量来自某些模块的东西,比如数学或渲染。然后,人们应该定期维护这些长列表,这样它实际上就只是人们需要的东西,不多不少。
但是包含我不需要的东西真的有那么严重吗?难道我不能只包含使用渲染和数学内容的 Render.hpp 和 Math.hpp 吗?而不是分别寻找每个小组件的所有标题并维护一个很长的包含列表?专业建议是始终只包含我需要的内容,但我使用的大多数库都是通过一个包含或单独包含它们的主要模块来包含的,而不是逐个包含它们的所有标题。
包含超出我需要的内容是否真的会造成如此混乱并增加编译/解析时间?
struct Fooo
{
void func() const {}
protected:
void func() {}
};
...
Fooo fooo;
fooo.func();
编译器说,func 不可访问,因为它是受保护的。为什么会这样?我原本以为非 const 版本根本就看不见,而 const 版本会被调用。
我遇到过这种情况,一个类为成员提供了 const 访问权限,同时还具有供内部使用的非 const 版本的函数。另一种情况是创建一个“受保护的可变”基类,其中所有非 const 访问器都声明为受保护的,因此一个类可以从它派生并保持其数据不被公众改变,而另一个派生类通过将 getter 引入公共范围来使其可用,例如Base::getterFunc;
。
class Base
{
int a;
public:
const auto& getA() const { return a; }
protected:
auto& getA() { return a; }
};
class PublicAccess : public Base
{
public:
Base::getA;
};
class KeepProtected : public Base
{
};
一个特定的例子是Vector
和NormalizedVector
源自VectorBase
。NormalizedVector
可以改变其元素,但不能由公众随机改变。
无论如何,例子不是重点,只是想知道这种不可访问性的背后逻辑是什么,当受保护的版本可以简单地看作不存在并选择 const 版本时。
struct Foo
{
struct Bar
{
int data = 0;
//constexpr Bar() = default; // Doesn't work either
constexpr Bar() : data(0) {}
};
static constexpr Bar bar = {}; // ERROR
//static constexpr Bar bar = {0}; // Works if the ctor from Bar is removed
};
Clang 和 GCC(使用 std=c++20)说我尝试使用的构造函数未定义。但如果我改为 ,它就会constexpr
起作用inline
。我想了解使用“contexpr”有什么问题。