小编Gri*_*wes的帖子

pop_back()返回值?

为什么没有pop_back()返回值?我用Google搜索了这一点,发现它使它更有效率.这是在标准中做到这一点的唯一原因吗?

c++ vector

50
推荐指数
6
解决办法
3万
查看次数

初始化构造函数中的字段 - 初始化列表与构造函数体

我一直在用c ++工作一段时间,但我不确定它们之间的区别

public : Thing(int _foo, int _bar): member1(_foo), member2(_bar){}
Run Code Online (Sandbox Code Playgroud)

public : Thing(int _foo, int _bar){
    member1 = _foo;
    member2 = _bar;
}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,他们做同样的事情,但这两种语法之间是否存在实际差异.其中一个比另一个更安全,它们是否以不同方式处理默认参数.

不完全习惯于第一个例子,所以如果我犯了错误,我道歉.

c++ parameters

48
推荐指数
4
解决办法
5万
查看次数

emplace_back()的行为与预期不符

我编写了一个简单的程序,可以在标准库容器中就地创建对象.这就是我写的:

#include <vector>
#include <iostream>

class AB
{
public:
   explicit AB(int n);
   AB(const AB& other) = delete;
   AB(AB&& other);
   AB& operator=(const AB& other) = delete;
   AB& operator=(AB&& other) = default;
private:
   int i;
};

AB::AB(int n): i( n )
{
   std::cout << "Object created." << std::endl;
};

AB::AB(AB&& other): i( std::move(other.i) )
{
   std::cout << "Object moved." << std::endl;
};

int main()
{
   std::vector< AB > v;
   v.emplace_back(1);
   v.emplace_back(2);
   v.emplace_back(3);
};
Run Code Online (Sandbox Code Playgroud)

我用g ++(版本4.8.2)编译它.运行输出后,我得到:

Object created.
Object created.
Object moved.
Object …
Run Code Online (Sandbox Code Playgroud)

c++ g++ std c++11

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

具有自动返回类型扣除的朋友功能模板无法访问私有成员

很抱歉这个问题的标题有多复杂; 我试图描述我为这个问题构建的最小SSCCE.

我有以下代码:

#include <iostream>

namespace fizz
{
    template<typename... Ts>
    class bar
    {
    public:
        template<int I, typename... Us>
        friend auto foo(const bar<Us...> &);

    private:
        int i = 123;
    };

    template<int I, typename... Ts>
    auto foo(const bar<Ts...> & b)
    {
        return b.i;
    }
}

int main()
{
    std::cout << fizz::foo<1>(fizz::bar<int, float>{});
}
Run Code Online (Sandbox Code Playgroud)

此代码使用GCC 5.2进行编译,不是使用Clang 3.7进行编译:

main.cpp:19:18: error: 'i' is a private member of 'fizz::bar<int, float>'
        return b.i;
                 ^
main.cpp:25:24: note: in instantiation of function template specialization …
Run Code Online (Sandbox Code Playgroud)

c++ templates friend language-lawyer c++14

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

按类型实例化C++ lambda

我想要一种从函数中制作仿函数的方法.现在我尝试通过lambda函数包装函数调用并稍后实例化它.但编译器说比删除lambda构造函数.那么有什么方法可以编译这段代码吗?或者也许是另一种方式?

#include <iostream>  

void func()
{
    std::cout << "Hello";
}

auto t = []{ func(); };
typedef decltype(t) functor_type;

template <class F>
void functor_caller()
{
    F f;
    f();
}

int main()
{
    functor_caller<functor_type>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我得到这样的编译器错误:

error: use of deleted function  '<lambda()>::<lambda>()'

error: a lambda closure type has a deleted default constructor
Run Code Online (Sandbox Code Playgroud)

在我看来,唯一的方法是使用宏:

#define WRAP_FUNC(f) \
struct f##_functor       \
{                       \
    template <class... Args >                             \
    auto operator()(Args ... args) ->decltype(f(args...)) \
    {                                                     \
        return f(args...);                                \
    }                                                     \ …
Run Code Online (Sandbox Code Playgroud)

c++ lambda instantiation c++11

21
推荐指数
4
解决办法
3142
查看次数

容器中的智能指针如std :: vector?

我正在学习有关智能指针(std::auto_ptr),只是看这里这里是智能指针(std::auto_ptr)不应该在容器(即放std::vector),因为即使大多数编译器不会抱怨,这似乎是正确的.没有规则说智能指针不会在内部复制(vector例如按类)并传输其所有权,然后指针将变为NULL.最后,一切都会搞砸.

实际上,这种情况多久发生一次?

有时我有指针的向量,如果在将来我决定我想要一个智能指针的矢量我会选择什么?

我知道C++ 0x和Boost库,但是现在,我更倾向于坚持使用STL方法.

c++ pointers smart-pointers std auto-ptr

19
推荐指数
2
解决办法
2万
查看次数

std :: forward_list和std :: forward_list :: push_back

我想使用std :: forward_list

因为:

转发列表是一个容器,支持从容器的任何位置快速插入和删除元素

但是没有*std :: forward_list :: push_back*实现.

是否有一种高性能的方法来增加对一个或没有理由的支持?

c++ std c++11 forward-list

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

内联命名空间中对命名空间的模糊引用

假设以下代码:

namespace test 
{ 
    namespace detail 
    { 
    }

    inline namespace v1 
    { 
        namespace detail 
        { 
            void foo() 
            { 
            }
        }
    }
}

int main()
{ 
    test::detail::foo(); 
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到,这段代码与Clang编译; 然而,与海湾合作委员会没有关系 - 海湾合作委员会抱怨说这namespace detail是不明确的:

main.cpp:20:11: error: reference to 'detail' is ambiguous
     test::detail::foo(); 
           ^
main.cpp:4:5: note: candidates are: namespace test::detail { }
     { 
     ^
main.cpp:10:9: note:                 namespace test::v1::detail { }
         { 
         ^
Run Code Online (Sandbox Code Playgroud)

哪个编译器在这里做正确的事情?

c++ g++ clang++ inline-namespaces c++14

16
推荐指数
2
解决办法
1099
查看次数

是否允许实现将公共成员添加到标准类型?

C++标准库实现是否允许将公共(和受保护)成员添加到标准类型的接口?N3797 17.6.5.5 [member.functions]/2说:

实现可以在类中声明其他非虚拟成员函数签名:

- 通过向成员函数签名添加带默认值的参数; [ 注意:实现可能不会向虚拟,全局或非成员函数添加具有默认值的参数.- 结束说明 ]

- 通过两个或多个具有等效行为的成员函数签名将成员函数签名替换为默认值; 和

- 通过为成员函数名称添加成员函数签名.

这是否意味着标准库无法在任何情况下(包括例如保留标识符)添加标准中未提及的任何其他公共成员?

一点点解释:这是关于添加签名的文本(我假设只是针对那些已经定义的函数的新签名,所以没有新的名称)我设法在标准中找到.还有脚注189,其中说:

有效的C++程序始终调用期望的库成员函数或具有等效行为的函数.实现还可以定义其他成员函数,否则这些函数将不会被有效的C++程序调用.

所有这些文本都来自[member.functions],所以它显然只是关于成员函数.我的问题更通用,并询问我可能错过的任何引用:是否允许标准库实现向标准类型的公共(和/或受保护)接口添加新名称,无论是数据还是函数成员?

c++ language-lawyer c++11 c++14

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

如何连接字符串和const char?

我需要在c中加入"hello world".我怎样才能做到这一点 ?

string a = "hello ";
const char *b = "world";

const char *C;
Run Code Online (Sandbox Code Playgroud)

c++ string

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