小编use*_*979的帖子

在C++ 11中使用max <int>作为谓词

在C++ 03中,以下代码可以正常工作:

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    std::vector<int> v2;
    v2.push_back(2);
    v2.push_back(3);
    v2.push_back(4);

    std::transform(v.begin(), v.end(), v2.begin(), v2.begin(), std::max<int>);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,这不起作用,因为它为std::max包含的内容添加了一个重载initializer_list.因此,您必须使用非常难看的强制转换来选择正确的重载:

static_cast<const int& (*)(const int&, const int&)>(std::max)
Run Code Online (Sandbox Code Playgroud)

我有几个问题.

  • 为什么标准委员会决定这样做,知道它会(可能)破坏现有代码并迫使用户创建一个丑陋的演员?
  • 未来的C++标准是否会试图缓解这个问题?
  • 什么是变通方法?

c++ c++11 c++14

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

修改临时不正确吗?

在C++ 98/03/11中,以下代码有效:

std::string meow() { return "meow"; }

int main()
{
    meow().append("purr");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于临时死在分号,这应该是安全的吗?

c++

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

使用委托构造函数来避免泄漏

在一次谈话中,以下代码已被证明是不安全的,因为如果构造函数抛出,则不会调用析构函数并泄漏资源:

class TwoResources {
    TwoResources(int x, int y)
        : m_a(nullptr), m_b(nullptr) {
        m_a = new A(x); m_b = new B(y);
    }
    ~TwoResources() {
        delete m_b; delete m_a;
    }
    A * m_a; B * m_b;
};
Run Code Online (Sandbox Code Playgroud)

建议解决方案是使用委托构造函数,如下所示:

class TwoResources {
    TwoResources() : m_a(nullptr), m_b(nullptr) { }
    TwoResources(int x, int y) : TwoResources() {
        m_a = new A(x); m_b = new B(y);
    }
    ~TwoResources() {
        delete m_b; delete m_a;
    }
    A * m_a; B * m_b;
};
Run Code Online (Sandbox Code Playgroud)

这是安全的,因为:

C++ 11 15.2 [except.ctor]/2:"如果对象的非委托构造函数已完成执行,并且该对象的委托构造函数存在异常,则将调用该对象的析构函数." …

c++ memory-leaks c++11

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

标签 统计

c++ ×3

c++11 ×2

c++14 ×1

memory-leaks ×1