为什么没有pop_back()返回值?我用Google搜索了这一点,发现它使它更有效率.这是在标准中做到这一点的唯一原因吗?
我一直在用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)
我有一种感觉,他们做同样的事情,但这两种语法之间是否存在实际差异.其中一个比另一个更安全,它们是否以不同方式处理默认参数.
不完全习惯于第一个例子,所以如果我犯了错误,我道歉.
我编写了一个简单的程序,可以在标准库容器中就地创建对象.这就是我写的:
#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) 很抱歉这个问题的标题有多复杂; 我试图描述我为这个问题构建的最小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) 我想要一种从函数中制作仿函数的方法.现在我尝试通过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) 因为:
转发列表是一个容器,支持从容器的任何位置快速插入和删除元素
但是没有*std :: forward_list :: push_back*实现.
是否有一种高性能的方法来增加对一个或没有理由的支持?
假设以下代码:
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++标准库实现是否允许将公共(和受保护)成员添加到标准类型的接口?N3797 17.6.5.5 [member.functions]/2说:
实现可以在类中声明其他非虚拟成员函数签名:
- 通过向成员函数签名添加带默认值的参数; [ 注意:实现可能不会向虚拟,全局或非成员函数添加具有默认值的参数.- 结束说明 ]
- 通过两个或多个具有等效行为的成员函数签名将成员函数签名替换为默认值; 和
- 通过为成员函数名称添加成员函数签名.
这是否意味着标准库无法在任何情况下(包括例如保留标识符)添加标准中未提及的任何其他公共成员?
一点点解释:这是关于添加签名的文本(我假设只是针对那些已经定义的函数的新签名,所以没有新的名称)我设法在标准中找到.还有脚注189,其中说:
有效的C++程序始终调用期望的库成员函数或具有等效行为的函数.实现还可以定义其他成员函数,否则这些函数将不会被有效的C++程序调用.
所有这些文本都来自[member.functions],所以它显然只是关于成员函数.我的问题更通用,并询问我可能错过的任何引用:是否允许标准库实现向标准类型的公共(和/或受保护)接口添加新名称,无论是数据还是函数成员?
我需要在c中加入"hello world".我怎样才能做到这一点 ?
string a = "hello ";
const char *b = "world";
const char *C;
Run Code Online (Sandbox Code Playgroud)