说,我们有
enum E
{
Foo = 0,
Bar = 1
};
Run Code Online (Sandbox Code Playgroud)
现在,我们做到了
enum E v = ( enum E ) 2;
Run Code Online (Sandbox Code Playgroud)
然后
switch ( v )
{
case Foo:
doFoo();
break;
case Bar:
doBar();
break;
default:
// Is the compiler required to honor this?
doOther();
break;
}
Run Code Online (Sandbox Code Playgroud)
由于上面的开关处理枚举的每个可能列出的值,是否允许编译器优化掉default
上面的分支,或者在enum的值不在列表中的情况下具有未指定或未定义的行为?
正如我期望C和C++的行为应该类似,问题在于两种语言.但是,如果在这种情况下C和C++之间存在差异,那么了解它也会很好.
当一个函数按值获取参数时,它通常可以修改它.然而,lambdas似乎并非如此.为什么?
int main()
{
int x = 0;
auto lambda = [x] { x = 1; }; // error: assignment of read-only variable ‘x’
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我收到了以下错误,我的应用用户通过市场开发者控制台报告:
java.lang.RuntimeException: Failed to register input channel. Check logs for details.
at android.view.InputQueue.nativeRegisterInputChannel(Native Method)
at android.view.InputQueue.registerInputChannel(InputQueue.java:92)
at android.view.ViewRoot.setView(ViewRoot.java:568)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.view.Window$LocalWindowManager.addView(Window.java:465)
at android.app.Dialog.show(Dialog.java:241)
at my.program.MyActivity.handleFailure(Unknown Source)
at my.program.MyActivity$RunFailed.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
斜体线是我的代码的一部分.有问题的代码只是创建并显示一个对话框.它从一个Runnable
发布到一个Handler
.一切都应该在GUI线程中发生(这Handler
就是使用的原因).
我不知道如何调试这个.我自己没有遇到过这个问题,而我所拥有的只是一堆自动报告.谷歌在这个确切的问题上显示了几个线程,但没有答案(除了暗示这是Android 2.3.3特定的问题).
在[0,n)中选择随机数的一种常用方法是采用rand()
模n的结果:rand() % n
.但是,即使可用rand()
实现返回的结果完全一致,当n = n均匀分配时,结果[0,n]数的均匀性是否应该存在问题?例如假设为2,n为2.然后,在3个可能的输出中:0,1和2,当我们使用模n时,我们分别得到0,1和0 .因此输出将根本不是均匀的.RAND_MAX + 1
RAND_MAX
rand()
这在实践中是一个真正的问题吗?选择[0,n]中的随机数是一种更好的方法,从rand()
输出中均匀推导出来,最好没有任何浮点运算?
在C++ 11中,隐式声明了没有任何异常规范的析构函数 noexcept
,这是对C++ 03的更改.因此,用于从C++ 03中的析构函数抛出的代码仍然可以在C++ 11中正常编译,但是一旦尝试从这样的析构函数抛出就会在运行时崩溃.
由于这样的代码没有编译时错误,如何将它安全地转换为C++ 11,而不是将代码库中的所有现有析构函数声明为noexcept(false)
,这实际上是过于冗长和干扰,或者检查每个析构函数是否有可能抛出,这将非常耗时且容易出错,或者在运行时捕获并修复所有崩溃,这永远无法保证找到所有这些情况?
c++ destructor exception-handling exception-specification c++11
我正在尝试为具有特定名称的内部类的类提供不同的模板特化.我从这里找到了一个线索并尝试了以下方法:
#include <iostream>
template< typename T, typename Check = void > struct HasXYZ
{ static const bool value = false; };
template< typename T > struct HasXYZ< T, typename T::XYZ >
{ static const bool value = true; };
struct Foo
{
class XYZ {};
};
struct FooWithTypedef
{
typedef void XYZ;
};
int main()
{
// The following line prints 1, as expected
std::cout << HasXYZ< FooWithTypedef >::value << std::endl;
// The following line prints 0. Why? …
Run Code Online (Sandbox Code Playgroud) Python文档定义datetime.weekday()
为一个整数,其中星期一为0,星期日为6,而C的tm.tm_wday
定义为星期日以来的天数.因此tm_wday
是(datetime.weekday() + 1) % 7
,这是相当不方便.鉴于Python通常接近C等价物,为什么这样做?
有std::array<T, N>::size()
,但它是非静态的,所以它需要一个 的实例std::array
。有没有办法获得它返回的值(即N
of std::array<T, N>
)而不必构造数组的实例?对于普通数组,我可以使用sizeof
,但我不能保证这sizeof(std::array<T, N>) == N * sizeof(T)
是真的。
这只是创建了一些列表元素,然后在开始时通过反向迭代删除元素.它是代码的实际问题的复制品,它在反向遍历它们时删除元素.
#include <list>
int main()
{
std::list< int > lst;
for ( int c = 33; c--; )
lst.push_back( 0 );
int count = 0;
for ( std::list< int >::reverse_iterator i = lst.rbegin(), e = lst.rend();
i != e; )
{
switch( count++ )
{
case 32:
case 33:
++i;
i = std::list< int >::reverse_iterator( lst.erase( i.base() ) );
break;
default:
++i;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行时,它会崩溃:
*** glibc detected *** ./a.out: double free or corruption (out): 0x00007fff7f98c230 *** …
Run Code Online (Sandbox Code Playgroud) 以下内容由 gcc(12.1 和 trunk)编译良好,但 clang(14.0.0 和 trunk)在 上给出错误d.foo()
,表示调用不明确。问题是,我应该向哪个编译器报告错误?
class Base
{
public:
void foo() {}
};
class Derived: public Base
{
public:
using Base::foo;
void foo() & {}
};
int main()
{
Derived d;
// Clang says here: error: call to member function 'foo' is ambiguous. Gcc,
// however, is fine with it
d.foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)