小编Con*_* Ma的帖子

文字“ 0”是int和const字符串的有效候选者,并且重载导致模棱两可的调用

我最近修复了一个错误。

在以下代码中,一个重载函数是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)

c++ overloading ambiguous-call

44
推荐指数
2
解决办法
1617
查看次数

何时为此结构调用复制构造函数?

我正在尝试使用{}列表进行一些测试.当我在VS2015中编译它时,输出是

copy A 0
Run Code Online (Sandbox Code Playgroud)

只是不明白,复制构造函数在哪里调用?

#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++

13
推荐指数
1
解决办法
1万
查看次数

通过在单元测试中定义自己的PRIVATE宏,可以使私有成员公开吗?

我确实需要测试一个C++类的私有成员方法.

由于它是私有方法,我不想将其更改为受保护,我不能通过创建子类并使用声明添加它来公开.

因此,如果我定义一个宏来替换私有关键字.这是解决这个问题的好方法吗?

#if __UNITTEST__
#define PRIVATE public
#else 
#define PRIVATE private
#endif

class A {
    PRIVATE:
        void f();
};
Run Code Online (Sandbox Code Playgroud)

c++ unit-testing

4
推荐指数
1
解决办法
183
查看次数

编译器什么时候不生成移动构造函数并移动赋值?

在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)

编辑:从书中复制"移动操作",这可能会导致混淆.将其更改为移动构造函数并移动赋值.

c++ c++11

1
推荐指数
1
解决办法
216
查看次数

标签 统计

c++ ×4

ambiguous-call ×1

c++11 ×1

overloading ×1

unit-testing ×1