今天我遇到了问题.我需要一个static会员功能,const不是必须而是更好.但是,我没有成功.任何人都可以说为什么或如何?
我正在研究一些C++代码,其中我有几个私有方法的管理器对象,如
void NotifyFooUpdated();
Run Code Online (Sandbox Code Playgroud)
它OnFooUpdated()在该对象的侦听器上调用该方法.
请注意,它们不会修改此对象的状态,因此它们在技术上可以成为const方法,即使它们通常会修改整个系统的状态.特别是,侦听器对象可能会回调此对象并对其进行修改.
就我个人而言,我想留下它们,而不是宣布它们const.
但是,我们的静态代码检查器QAC将此标记为偏差,因此我要么必须声明它们const,要么我必须争论为什么它们应该保持非常量并获得偏差的授权.
没有声明这些方法的论据是什么const?
或者我应该关注QAC并宣布它们const?
我应该采用仅限于此对象的严格本地观点,还是将系统视为一个整体?
示例代码取自:http://en.cppreference.com/w/cpp/types/add_cv (我修改了一下.)
struct foo
{
void m() { std::cout << "Non-cv\n"; }
void m() const { std::cout << "Const\n"; }
};
template<class T>
void call_m()
{
T().m();
}
int main()
{
call_m<foo>();
call_m<const foo>(); //here
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Non-cv
Non-cv
Run Code Online (Sandbox Code Playgroud)
在第二次调用中,T是const限定的,所以T()应该调用const版本,对吧?还是有一些我错过的特殊规则?
在这种情况下
void f(int *);
void f(const int *);
...
int i;
f(&i);
Run Code Online (Sandbox Code Playgroud)
情况很清楚 - f(int *) 被调用,这似乎是正确的。
但是,如果我有这个(错误地这样做了(*)):
class aa
{
public:
operator bool() const;
operator char *();
};
void func(bool);
aa a;
func(a);
Run Code Online (Sandbox Code Playgroud)
运算符 char *() 被调用。我不明白为什么这样的决策路径比使用 operator bool() 更好。有任何想法吗?
(*) 如果将 const 添加到第二个运算符,则代码当然会按预期工作。
c++ overloading conversion-operator language-lawyer const-method
const 成员函数只调用 const 成员函数吗?
class Transmitter{
const static string msg;
mutable int size;
public:
void xmit() const{
size = compute();
cout<<msg;
}
private:
int compute() const{return 5;}
};
string const Transmitter::msg = "beep";
int main(){
Transmitter t;
t.xmit();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
如果我不使 compute() 成为一个常量,那么编译器就会抱怨。是不是因为 const 成员函数不允许修改成员,它不允许对非常量的任何调用,因为这意味着 const 成员函数将“间接”修改数据成员?
我很难弄清楚如何从const类方法返回non-const对元素的引用std::vector.我想要的一个简单例子是,
template<class T>
class MyClass
{
public:
MyClass : myVec(3)
{
}
T& x() const
{
return *(myVec.data())[0]
}
std::vector<T> myVec;
}
Run Code Online (Sandbox Code Playgroud)
我想要的行为是,我希望能够做到以下几点,
MyClass obj<double>;
obj.x() = 3.3;
assert(obj.x()==3.3)
Run Code Online (Sandbox Code Playgroud)
Eigen给出了相同类型的行为,但我无法弄清楚如何让它工作.