标签: c++

C++ 11是否改变了STL容器元素的要求,以及如何?

最近我很惊讶std::unique_ptrSTL容器的元素是可以接受的,因为我认为这些元素需要提供以下功能(这个页面说的相同):

  • 没有参数的公共默认构造函数
  • 公共复制构造函数
  • 公共复制分配操作员功能
  • 公共析构函数

但是std::unique_ptr不能复制使它所拥有的指针由单个对象拥有,这与上述要求相矛盾.

标准是否改变了要求?如果是这样,有什么变化?也许可移动物体或可复制物体都足够了?我在网上搜索了自C++ 11以来需求是否发生了变化,但我找不到任何帮助我的页面...

c++ stl c++11

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

检查变量是否可迭代?

有没有办法检查任意变量类型是否可迭代?

那么要检查它是否有索引元素,或者我可以实际循环它的孩子?(例如使用foreach?)

是否可以为此创建通用模板?

我在搜索时找到了其他编程语言的技巧.然而,仍然必须找到如何在C++中做到这一点.

c++ arrays iterable

25
推荐指数
5
解决办法
6740
查看次数

C++转发声明类作用域枚举

我想知道是否可以转发声明在另一个类范围内定义的枚举.例如,请考虑以下事项:

//A.h
class A
{
public:
    enum class type: unsigned long { /*some stuff*/ }
};
Run Code Online (Sandbox Code Playgroud)

现在,在另一个标题中,我想转发声明'type'枚举(假设下面的B类有一个用A :: type做某事的函数)

//B.h
enum A::type; //use of undefined type 'A'

class B
{
public:
    UseTypeEnum(A::Type&);
};
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

//B.h
class A;
enum A::type; //still use of undefined type

class B...
Run Code Online (Sandbox Code Playgroud)

如果在Ah中将枚举声明为全局范围,则没有问题

有没有办法做到这一点?

c++ c++11

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

为什么具有固定底层类型char的枚举值会解析为fct(int)而不是fct(char)?

在回答有关使用枚举的重载解析的问题时,出现了此问题.

虽然案例long long肯定是MSVC2012NovCTP中的一个错误(根据标准文本和gcc 4.7.1的测试),我无法弄清楚为什么会出现以下行为:

#include <iostream>

enum charEnum : char { A = 'A' };

void fct(char)      { std::cout << "fct(char)"      << std::endl; }
void fct(int)       { std::cout << "fct(int)"       << std::endl; }
void fct(long long) { std::cout << "fct(long long)" << std::endl; }

int main() 
{
    fct('A');
    fct(A);
}
Run Code Online (Sandbox Code Playgroud)

MSVC2012NovCTP和gcc 4.7.1都同意此输出:

fct(char)
fct(int)

A应该转换charEnumchar?为什么A被转换成int

编辑:clang抱怨说这个电话含糊不清,这与我在下面的解释一致; 那说,如果它只被认为是潜在的类型,我仍然会发现它更直观.


两个相关的标准摘录是§7.2/ 9:

枚举器的值或未范围的枚举类型的对象通过整数提升转换为整数(4.5)

并且§4.5/ 4:

其底层类型为固定(7.2)的无范围枚举类型的prvalue可以转换为其基础类型的prvalue.此外,如果可以对其基础类型应用整数提升,则其基础类型固定的未范围枚举类型的prvalue也可以转换为提升的基础类型的prvalue.

因此, …

c++ enums overloading overload-resolution c++11

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

什么是SCARY迭代器?

当我进入SCARY迭代器主题时,我正在阅读有关VC11的C++ 11功能的VC11博客.

什么是SCARY迭代器?这对我的C++编码体验有何影响?

c++ c++11

25
推荐指数
2
解决办法
3538
查看次数

不能在数组上使用.begin()或.end()

错误如下:

请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来.

我的代码:

#include <iostream>
using namespace std;

int main()
{
    int * mypointer;

    int arr[5] = {1,3,5,7,9};

    mypointer = arr;

    for(auto it = arr.begin(); it != arr.end(); ++it) {
        cout<<*mypointer<<endl;

        mypointer++;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers iterator c++11

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

如何使用sfinae选择构造函数?

在模板元编程中,可以在返回类型上使用SFINAE 来选择某个模板成员函数,即

template<int N> struct A {
  int sum() const noexcept
  { return _sum<N-1>(); }
private:
  int _data[N];
  template<int I> typename std::enable_if< I,int>::type _sum() const noexcept
  { return _sum<I-1>() + _data[I]; }
  template<int I> typename std::enable_if<!I,int>::type _sum() const noexcept
  { return _data[I]; }
};
Run Code Online (Sandbox Code Playgroud)

但是,这对构造函数不起作用.假设,我想声明构造函数

template<int N> struct A {
   /* ... */
   template<int otherN>
   explicit(A<otherN> const&); // only sensible if otherN >= N
};
Run Code Online (Sandbox Code Playgroud)

但不允许这样做otherN < N.

那么,SFINAE可以在这里使用吗?我只对允许自动模板参数扣除的解决方案感兴趣

A<4> a4{};
A<5> a5{};
A<6> …
Run Code Online (Sandbox Code Playgroud)

c++ constructor sfinae c++11

25
推荐指数
4
解决办法
5909
查看次数

为什么C++没有power运算符?

许多语言都有电力运营商; 为什么不用C++?例如,Fortran和Python使用**并且通常使用(例如在LaTeX中)编写^.

c++ operator-keyword

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

如何cout一个带有n个小数位的浮点数

可能重复:
如何使用cout以完全精度打印double值?

float a = 175.;
   cout << a;
Run Code Online (Sandbox Code Playgroud)

如果我运行前面的代码我将只得到175,我怎么能用(例如)3个小数位来输出数字,即使它们是零...我怎么能打印"175.000"?

c++ formatting cout

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

内置类型有移动语义吗?

考虑以下代码:

#include <iostream>
using namespace std;

void Func(int&& i) {
    ++i;
}

int main() {
    int num = 1234;
    cout << "Before: " << num << endl;
    Func(std::move(num));
    cout << "After: " << num << endl;
}
Run Code Online (Sandbox Code Playgroud)

它的输出是:

Before: 1234
After: 1235
Run Code Online (Sandbox Code Playgroud)

显然,i正在内部进行修改Func,因为它i在被"转换"为r值引用之后被绑定到参数std::move.

好吧,我的观点:

移动对象意味着将资源的所有权从一个对象转移到另一个对象.但是,内置类型不包含资源,因为它们本身就是资源.转移他们持有的资源毫无意义.如示例所示,num修改了s值.它的资源,它的自我,是被修改的资源.

内置类型有移动语义吗?

另外,内置类型对象在移动后(如果是)是一个明确定义的行为吗?

c++ built-in-types move-semantics c++11

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