小编Kou*_*tty的帖子

std :: remove_reference解释了什么?

我看到了可能的实现,std::remove_reference如下所示

template< class T > struct remove_reference      {typedef T type;};
template< class T > struct remove_reference<T&>  {typedef T type;};
template< class T > struct remove_reference<T&&> {typedef T type;};   
Run Code Online (Sandbox Code Playgroud)

为什么有专业化lvaluervalue reference?一般模板本身是否足够并删除引用?我在这里很困惑,因为在T&或者T&&专业化中如果我尝试使用::type我还应该得到T&T&&分别对吗?

你能解释一下,为什么我们投入remove_reference<t>::type&&移动?(是因为参数被命名所以它将被视为移动函数内的左值?).

另外,你能指出一种方法,我可以找到并打印出这种类型的东西吗?例如,如果它的rvalue类型,int那么我应该能够打印出来的那个int&&?(我一直在用std::is_same手动检查.)

感谢您的时间.

c++ templates template-specialization c++11

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

如何返回不可移动(但可复制)的对象?

编辑:结束目标:我想创建一个永远不会使用移动的容器类,即使它可用.NonMove是该容器的一类测试对象.

我尝试了不同的变化,但GCC坚持要使用移动.

class NonMove {
 public:
  NonMove() {}

  // Copy.
  NonMove(const NonMove&) {}
  NonMove& operator=(const NonMove&) {}

  // Move
  NonMove(NonMove&&) = delete;
  NonMove& operator=(NonMove&&) = delete;
};

NonMove foo() {
  return NonMove();
}
Run Code Online (Sandbox Code Playgroud)

使用-std = gnu ++ 11时GCC 4.9.1出错

move.cc: In function ‘NonMove foo()’:
move.cc:15:18: error: use of deleted function ‘NonMove::NonMove(NonMove&&)’
   return NonMove();
                  ^
move.cc:10:3: note: declared here
   NonMove(NonMove&&) = delete;
   ^
Run Code Online (Sandbox Code Playgroud)

c++ move

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

如何为用户定义的类型实现初始化列表?(类似于std :: vector初始化列表)

std::vector 可以初始化为

std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 
Run Code Online (Sandbox Code Playgroud)

参考

现在,如果想要为我的某个类型实现类似的功能,我该如何去做呢?我该如何实现此功能的构造函数?

标准如何支持我实现这一目标(参考标准将是最有帮助的)?基本上,如果你可以教我如何实现std::vector它就足够了.

这可以在C++ 11之前完成吗?

另外,我可以使用POD结构类型初始化列表,以便我可以使用不同类型的值来初始化我的类型吗?

c++ initializer-list c++11

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

为什么auto不能用于超载功能?

我明白使用templates是一种值得赞赏的重载方式,但我想知道为什么auto不能用于函数参数类型推导,从而有助于重载函数?

N3690 在7.6.1.4/3中说,使用auto可以使lambda表达式成为通用的,提供此示例

auto glambda = [](int i, auto a) { return i; };//OK: a generic lambda
Run Code Online (Sandbox Code Playgroud)

(注意:N3485中没有提到)

1).为什么我不能为例如正常功能做类似的事情

void swap(auto& param1, decltype(param1)& param2)
{
     decltype(param1) temp = param1;
     param1 = param2;
     param2 = temp;
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误error : parameters declared auto.

来自N3690 7.1.6.4/4

使用auto或decltype(auto)声明的变量的类型是从其初始化程序推导出来的.在块(6.3),命名空间范围(3.3.6)和for-init-statement(6.5.3)中声明变量时,允许使用此方法.[...]

我错了在假设param1param2归入块范围,因此有资格自动扣除?

2).如果允许这样的功能会有什么陷阱?

我正在使用gcc 4.8.1.

谢谢

c++ overloading auto c++14

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

捕获的变量隐藏在lambda中传递变量.怎么取消隐藏?

考虑这个例子:

int main()
{
    int a = 100;
    std::cout<<[=,&a](int a,int b){return a+b;}(99,1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出101不是我期望的100.

我不能指定,[&a,=]因为它给出了错误.

如何避免名称隐藏并引用参数.我知道更改名称是选项,但我很好奇.也参考标准会有所帮助

编辑:我正在使用gcc 4.7.1

编辑:

这是显示演示的ideone链接.我用C++编译器4.7.2那里
ideone

c++ c++11

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

为什么有人需要指针指针?

例如,为什么需要char **myVariable;?如果一个指针只是内存中的一个地址,那么如果它是一个指向带有指向char地址的指针的地址的指针,而不仅仅是指向带有char的地址的指针,它会产生什么区别?

在组装中不会这样

LDR R3, =myVariable
LDR R2, =[R3]
LDR R1, =[R2]
LDR R0, =[R1]
Run Code Online (Sandbox Code Playgroud)

单个指针的位置

LDR R1, =myVariable
LDR R0, =[R1]
Run Code Online (Sandbox Code Playgroud)

现在R0持有价值?显然这种方式更快.

c++ assembly pointers

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

ref限定符在gcc4.7.2和vc10中给出错误

考虑以下最小的例子.

#include<iostream>

struct A
{
    A(){std::cout<<"def"<<'\n';}
    void foo()&{std::cout<<"called on lvalue"<<'\n';}
};

int main()
{   
    A a;
    a.foo();
    A().foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给出了关于expecting ';' at the end of declaration和的错误and expected un-qualified-id before '{'.

我能知道我做错了什么吗?在实际的代码中我想避免通过temporaries调用非静态成员函数.

试过gcc 4.7.2和vc2010.谢谢.

c++ g++ visual-studio-2010 c++11

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

托管代码中使用的STL向量

操作系统:xp
IDE:VS 2008
在我正在使用Visual C++进行的项目中,我已经声明了一个std::vector内部托管类

std::vector<pts> dataPoints;//this gives error c4368 : mixed type not allowed 
Run Code Online (Sandbox Code Playgroud)

但这很有效

std::vector<pts> * dataPoints;//a pointer to the vector  
Run Code Online (Sandbox Code Playgroud)

然后我在免费商店中创建了这个向量,就像在托管类的构造函数中一样

dataPoints = new std::vector<pts>(noOfElements,pts());//which is not so attractive.
Run Code Online (Sandbox Code Playgroud)

我需要矢量的原因是因为有文件我正在阅读ifstream并将这些值存储在矢量中.
Q1)为什么我能够声明指向本机类型的对象(我猜)而不是对象?此外,在尝试向量之前,我尝试了托管数组

cli::array<Point> dataPoints //and i defined it later.
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候

ifile >> dataPoints[i].X;   
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误c2678:operator =没有超载int!!
Q2)为什么我不能在这里使用托管代码.起初我认为它可能是一个包装类Int,但随后autounboxing(转换运算符)应该处理它?还是Point :: X是合格的property,因此不被认为是正常的int?我错过了什么?这就是我选择vectorpts 解决的原因.
pts如下

 struct pts
{
  int X, int Y;
  pts() : X(0),Y(0){}
  pts(int x,int y) : …
Run Code Online (Sandbox Code Playgroud)

c++ managed-c++ stl visual-c++

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

如何在for循环中检查"i"达到一定值

当我= =某个值时,我正在寻找一个代码来执行for循环中的某些操作.

   for(int i=0; i<n; i++)
    {
        if (i == 300 or i == 600 or i == 900 or i == 1200 .... ) 
             // then do some action

          else 

            // do some other action .... 
    }
Run Code Online (Sandbox Code Playgroud)

我怎么检查这个 (i == 300 or i == 600 or i == 900 or i == 1200 .... )

c++

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