可能重复:
文件范围内可变修改的数组
我有一些关于VLA及其行为的概念,我需要澄清一下.
自C99起AFIK可以将VLA声明为本地范围:
int main(int argc, char **argv)
{
// function 'main' scope
int size = 100;
int array[size];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它在全球范围内被禁止:
const int global_size = 100;
int global_array[global_size]; // forbidden in C99, allowed in C++
int main(int argc, char **argv)
{
int local_size = 100;
int local_array[local_size];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在C99中声明了一个VLA,因为const修饰符不会创建编译时值.在C++中global_size是一个编译时值,因此,global_array不会成为VLA.
我需要知道的是:我的推理是否正确?我描述的行为是正确的吗?
我也想知道:为什么不允许全球范围内的VLA?在C和C++中是否被禁止?数组在全局和局部范围内的行为有什么不同?
我目前正在使用vim并且希望每次我需要自动添加(例如在javascript之后或在Python中冒号之后).出于某种原因,我尝试了autoindent和smartindent,但每个新行给了我2个标签而不是一个.它为什么这样做?我以为它只会插入一个标签.
我当前的〜/ .vimrc文件有:
set ts=4
set autoindent
set smartindent
filetype plugin indent on
Run Code Online (Sandbox Code Playgroud) 我有一个类base只包含私有默认构造函数和公共删除的复制构造函数,没有别的.
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
如果我尝试继承base并创建类的实例,derived如下所示,g ++ 4.8.2不会编译我的代码,但VC++ 2013会编译.
class derived : public base {
private:
derived() = default;
};
derived x;
Run Code Online (Sandbox Code Playgroud)
那么,它是g ++或VC++ 2013中的一个错误,只是忽略了什么?
这是完整的代码......
class base {
private:
base() = default;
public:
base(const base&) = delete;
};
class derived : public base {
private:
derived() = default;
};
derived x;
int main() {
}
Run Code Online (Sandbox Code Playgroud)
...和g ++错误消息.
main.cpp:12:5: error: 'constexpr derived::derived()' is private
derived() …Run Code Online (Sandbox Code Playgroud) 我view.startDrag()用来开始拖动操作.在拖动时,会收到事件OnDragListener.我也DragShadowBuilder用来显示View B拖动时的最后一张图像.
有没有办法停止或取消或中止某些外部事件或操作的拖动?例如,有2个视图,View A并且View B,我拖View B过View A.在拖动时,由于某些外部事件或操作,我想取消拖动操作或取消OnDragListener(不移除我的手指view B).
代码段DragShadowBuilder:
DragShadowBuilder shadowBuilder = new DragShadowBuilder(view) {
@Override
public void onDrawShadow(Canvas canvas) {
canvas.drawBitmap(b, 0, 0, new Paint());
super.onDrawShadow(canvas);
}
};
boolean dragSuccess = false;
dragSuccess = view.startDrag(null, shadowBuilder, view, 0);
Run Code Online (Sandbox Code Playgroud)
代码段OnDragListener:
private final class ViewDragListener implements OnDragListener {
@Override
public boolean onDrag(View v, DragEvent event) {
int …Run Code Online (Sandbox Code Playgroud) 我type_traits在新的C++ 14运行时大小的数组上测试了标题中的一些工具,请考虑以下代码:
int g[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
template <typename T> void print(T &t)
{
std::cout << "Type id: " << typeid(T).name() << '\n';
std::cout << "is_array: " << std::is_array<decltype(T)>::value << '\n';
std::cout << "is_pointer: " << std::is_pointer<decltype(T)>::value << '\n';
std::cout << "extent: " << std::extent<decltype(T)>::value << '\n';
}
int main()
{
print(g);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
静态大小的数组g返回以下输出:
Type id: A11_i
is_array: 1
is_pointer: 0
extent: 11
Run Code Online (Sandbox Code Playgroud)
A11_i我假设的 unmangled …
我必须处理一个逗号分隔的字符串,其中包含三元组值并将它们转换为运行时类型,输入如下所示:
"1x2y3z,80r160g255b,48h30m50s,1x3z,255b,1h,..."
Run Code Online (Sandbox Code Playgroud)
所以每个子字符串都应该这样转换:
"1x2y3z" should become Vector3 with x = 1, y = 2, z = 3
"80r160g255b" should become Color with r = 80, g = 160, b = 255
"48h30m50s" should become Time with h = 48, m = 30, s = 50
Run Code Online (Sandbox Code Playgroud)
我现在面临的问题是,所有的组件都是可选的(但他们维持秩序),所以下面的字符串也是有效的Vector3,Color和Time值:
"1x3z" Vector3 x = 1, y = 0, z = 3
"255b" Color r = 0, g = 0, b = 255
"1h" Time h = 1, m …Run Code Online (Sandbox Code Playgroud) c++23operator ()引入了和的静态版本operator []:
#include <iostream>\n#include <format>\n\nstruct S\n{\n static int operator()(int a, int b) { return a + b; }\n static int operator[](int a, int b) { return a - b; }\n};\n\nint main()\n{\n std::print("({})[{}]", S{}(1, 0), S{}[3, 1]); // (1)[2]\n// ^^ ^^ <-- Create temporary instances of \'S\'?!\n std::print("({})[{}]", S()(2, 1), S()[5, 1]); // (3)[4]\n// ^^ ^^ <-- Create temporary instances of \'S\'?!\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n令我震惊的是,为了调用静态版本的运算符()和[]需要类的实例;我期望能够从类型中调用两个运算符(作为其他静态成员),但它的格式不正确:
// type …Run Code Online (Sandbox Code Playgroud) 我试图从C++ Primer第5版开始练习7.32.该练习要求如下:
定义你自己的版本
Screen,并Window_mgr在其中clear的成员Window_mgr和朋友Screen.
下面是定义Screen,Window_mgr并clear在文中给出.
class Screen
{
public:
using pos = std::string::size_type;
Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) { }
private:
pos height = 0, width = 0;
std::string contents;
};
class Window_mgr
{
public:
using ScreenIndex = std::vector<Screen>::size_type;
void clear(ScreenIndex);
private:
std::vector<Screen> screens{Screen(24, 80 ' ')};
};
void Window_mgr::clear(ScreenIndex i)
{
Screen &s = screens[i];
s.contents …Run Code Online (Sandbox Code Playgroud) 这似乎是另一个"谁做得好"?问题,因为gcc 6.0.0和clang 3.7.0表现不同.
假设我们有一个变量模板,它采用const char *非模板参数,并且专用于给定的指针:
constexpr char INSTANCE_NAME[]{"FOO"};
struct Struct{ void function() const { std::cout << __PRETTY_FUNCTION__; } };
std::ostream &operator <<(std::ostream &o, const Struct &) { return o << INSTANCE_NAME; }
template <const char *> char Value[]{"UNKNOWN"};
// spezialization when the pointer is INSTANCE_NAME
template < > Struct Value<INSTANCE_NAME>{};
Run Code Online (Sandbox Code Playgroud)
请注意,模板变量具有不同的类型,具体取决于特化.十,我们有两个模板函数,每个函数都有一个const char *非模板参数,并将其转发给变量模板:
template <const char *NAME> void print()
{
std::cout << Value<NAME> << '\n';
}
template <const char *NAME> void …Run Code Online (Sandbox Code Playgroud) 正如C++标准(工作草案)所说:
9.5.1 [class.union]
在并集中,至多一个非静态数据成员可以在任何时间处于活动状态,也就是说,任何时候最多一个非静态数据成员的值都可以存储在并集中.[...] union的大小足以包含其中最大的非静态数据成员.每个非静态数据成员都被分配,就好像它是结构的唯一成员一样.union对象的所有非静态数据成员都具有相同的地址.
但我不知道如何识别哪个是工会的活跃成员,而且我没有用到足够深入标准来找到标准所说的内容,我试图弄清楚活动成员是如何设置的但我发现它是如何交换的:
9.5.4 [class.union]
[ 注意:通常,必须使用显式析构函数调用和放置新运算符来更改联合的活动成员.- 注完 ] [ 实施例:考虑的对象
u的union type U类型的具有非静态数据成员米M和n类型的N.如果M有一个非平凡的析构函数并且N有一个非平凡的构造函数(例如,如果它们声明或继承虚函数),则可以安全地将u的活动成员切换m为n使用析构函数和placement new运算符,如下所示:Run Code Online (Sandbox Code Playgroud)u.m.~M(); new (&u.n) N;- 结束例子 ]
所以我的猜测是,工会的活跃成员是首先签署,使用,构建或放置新的成员; 但是这对于统一初始化变得有点棘手,请考虑以下代码:
union Foo
{
struct {char a,b,c,d;};
char array[4];
int integer;
};
Foo f; // default ctor
std::cout << f.a << f.b << f.c << f.d << '\n';
Run Code Online (Sandbox Code Playgroud)
哪个是上面代码的联合的活跃成员?是 …