我最近修复了一个错误。
在以下代码中,一个重载函数是const,而另一个则不是。通过将两个函数都设为const可以解决此问题。
我的问题是为什么编译器只在参数为0时才抱怨它。
#include <iostream>
#include <string>
class CppSyntaxA
{
public:
void f(int i = 0) const { i++; }
void f(const std::string&){}
};
int main()
{
CppSyntaxA a;
a.f(1); // OK
//a.f(0); //error C2666: 'CppSyntaxA::f': 2 overloads have similar conversions
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用{}列表进行一些测试.当我在VS2015中编译它时,输出是
Run Code Online (Sandbox Code Playgroud)copy A 0
只是不明白,复制构造函数在哪里调用?
#include <iostream>
struct A
{
A() = default;
A(int i) : m_i(i) {}
A(const A& a)
{
std::cout << "copy A " << m_i << std::endl;
}
int m_i = 0;
};
struct B
{
B(const A& a) : m_a(a) {}
B(const A& a1, const A& a2) {}
A m_a;
};
int main()
{
A a1{1}, a2{2};
B b({ a1, a2 });
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我确实需要测试一个C++类的私有成员方法.
由于它是私有方法,我不想将其更改为受保护,我不能通过创建子类并使用声明添加它来公开.
因此,如果我定义一个宏来替换私有关键字.这是解决这个问题的好方法吗?
#if __UNITTEST__
#define PRIVATE public
#else
#define PRIVATE private
#endif
class A {
PRIVATE:
void f();
};
Run Code Online (Sandbox Code Playgroud) 在Effective Modern C++中,它说
仅为缺少显式声明的移动操作,复制操作和析构函数的类生成移动操作.
但是我用Gcc和Clang测试了它,没有错误被抛出.那条规则已经过时了吗?
示例程序:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class A
{
int i;
public:
~A() = default;
};
int main()
{
A a, b;
a = b;
A c(a);
A d(std::move(a));
b = std::move(d);
}
Run Code Online (Sandbox Code Playgroud)
编辑:从书中复制"移动操作",这可能会导致混淆.将其更改为移动构造函数并移动赋值.