是否可以创建一个initializer_listof 变量,例如函数参数(参见 function test)?
下面的代码有效,Clang 和 GCC 都没有抱怨任何事情,但我只想确保这没问题。
#include <iostream>
#include <initializer_list>
template <class T>
struct array
{
T *ptr;
size_t len;
array() { clear(); }
array( T *p, size_t l ) { assign(p,l); }
inline void clear() { ptr=nullptr; len=0; }
inline void assign( T *p, size_t l ) { ptr=p; len=l; }
inline T& operator[] ( size_t i ) const { return ptr[i]; }
};
template <class T>
inline array<const T> wrap( const std::initializer_list<T>& lst …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
#include <iostream>
struct A
{
A() {} // Can't be commented
A( const A& other ) =delete;
int i;
};
struct B : public A
{
B( int j ) { this->i = j; }
B( const B& other ) { this->i = other.i; }
};
int main()
{
B b(42);
std::cout << b.i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我注释A的空构造函数,为什么我不能编译这段代码?我以为A总是有一个默认的构造函数,当我禁用它的复制构造函数时会发生什么变化?
我们h是一个5x5矩阵,为什么零填充使用fft2中
H = fft2(h,250,250);
Run Code Online (Sandbox Code Playgroud)
没有给出与padarray手动使用相同的结果,如
H = fft2(padarray(H,[122 122]));
Run Code Online (Sandbox Code Playgroud)
是因为在我的第二个例子中,填充矩阵只有249列和行?我应该添加额外的列/行零吗?
我很想知道为什么&a = &b在C++中不允许使用类似的赋值.
我理解这样做的风险,但至少对我来说,完全禁止它是不够的理由.我之所以这么想是因为我正在寻找一种智能的方式来交换大型对象而不需要复制,这样的东西似乎是一个好主意:
void ptr_swap( ptrdiff_t &a, ptrdiff_t &b )
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
int main()
{
double a = 157648.13;
double b = 96871.84;
printf("%.4f %.4f\n", a, b);
ptr_swap( reinterpret_cast<ptrdiff_t>(&a), reinterpret_cast<ptrdiff_t>(&b) );
printf("%.4f %.4f\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)
..但显然,编译器并不这么认为.:(
编辑:我理解为什么这不起作用.也许我的问题会更清楚:我不知道变量在一个程序中有多少属性,但至少有一个名称,一个值,一个地址,以及它的生命周期的一些指示.问题是,对我来说,交换本质上是重命名存储在内存中的两个现有值,并且它会产生副本是无稽之谈.
我放弃了这个"可怕的"代码示例,我要做的就是对编译器说:"从现在开始,b被命名为a,反之亦然".为什么这样的事情不可能?动机是,已经可以通过TMP以某种方式"指导编译器",所以为什么不这样呢?