我看到了可能的实现,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)
为什么有专业化lvalue和rvalue reference?一般模板本身是否足够并删除引用?我在这里很困惑,因为在T&或者T&&专业化中如果我尝试使用::type我还应该得到T&或T&&分别对吗?
你能解释一下,为什么我们投入remove_reference<t>::type&&移动?(是因为参数被命名所以它将被视为移动函数内的左值?).
另外,你能指出一种方法,我可以找到并打印出这种类型的东西吗?例如,如果它的rvalue类型,int那么我应该能够打印出来的那个int&&?(我一直在用std::is_same手动检查.)
感谢您的时间.
编辑:结束目标:我想创建一个永远不会使用移动的容器类,即使它可用.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) std::vector 可以初始化为
std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"};
Run Code Online (Sandbox Code Playgroud)
现在,如果想要为我的某个类型实现类似的功能,我该如何去做呢?我该如何实现此功能的构造函数?
标准如何支持我实现这一目标(参考标准将是最有帮助的)?基本上,如果你可以教我如何实现std::vector它就足够了.
这可以在C++ 11之前完成吗?
另外,我可以使用POD结构类型初始化列表,以便我可以使用不同类型的值来初始化我的类型吗?
我明白使用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)中声明变量时,允许使用此方法.[...]
我错了在假设param1和param2归入块范围,因此有资格自动扣除?
2).如果允许这样的功能会有什么陷阱?
我正在使用gcc 4.8.1.
谢谢
考虑这个例子:
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
例如,为什么需要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持有价值?显然这种方式更快.
考虑以下最小的例子.
#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.谢谢.
操作系统: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?我错过了什么?这就是我选择vector和pts 解决的原因.
pts如下
struct pts
{
int X, int Y;
pts() : X(0),Y(0){}
pts(int x,int y) : …Run Code Online (Sandbox Code Playgroud) 当我= =某个值时,我正在寻找一个代码来执行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++ ×9
c++11 ×4
assembly ×1
auto ×1
c++14 ×1
g++ ×1
managed-c++ ×1
move ×1
overloading ×1
pointers ×1
stl ×1
templates ×1
visual-c++ ×1