kar*_*doc 12 c++ decltype c++11
假设我有一个这样的类:
class Foo
{
std::vector<int> bar;
public:
std::vector<int>& get_bar() { return bar; }
};
Run Code Online (Sandbox Code Playgroud)
后来,我想要另一个与其他类型相同的变量bar.如果我能做到这一点,对我来说是有意义的:
decltype(Foo::bar) clone_of_bar;
Run Code Online (Sandbox Code Playgroud)
但这不起作用.编译器告诉我'std :: vector <int> Foo :: bar'是私有的.
所以我最终不得不使用这样的东西:
std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;
Run Code Online (Sandbox Code Playgroud)
哪个有效,但看起来像是一团糟.也许有一种更容易的方法; 我不太确定.但我真正想知道的是为什么我不能只使用decltype(Foo::bar).为什么有人关心bar私人?这不像我实际上访问变量.
decltype是该语言的新功能.我只是不明白为什么它的设计不适用于私有变量.
Jon*_*ely 17
在语言律师术语中,bar是一个名称,decltype在编译器必须进行正常名称查找的表达式中使用它,它尊重访问控制.
为什么应该decltype与其他语言设计不同?你没有提出任何有说服力的论据,说明为什么它不应该与例如一致sizeof.
作为一个类作者,我不希望您能够查询这样的私有实现细节.如果我希望类型在类之外可用,我会定义一个公共typedef来告诉你它是什么类型.
后来,我想要另一个与其他类型相同的变量
bar
您想要"私有实现细节"的"另一个变量"吗?因此,如果类的作者Foo重构他们的代码并用其他一些实现细节替换该类型,突然你的代码改变意义,不相关的代码可能会突然停止编译或默默地拥有不同的行为,因为那些代码愚蠢地依赖私有细节而不是它的商业.这将引入私有实现细节和作者Foo甚至不知道存在的无关代码之间的耦合!这是一个糟糕的主意.
| 归档时间: |
|
| 查看次数: |
3471 次 |
| 最近记录: |