我最近发现了clang和gcc的奇怪行为.我有一个struct(MyClass),它为其中一个成员(active)使用类内初始化:
struct MyClass {
int something;
bool active = true;
};
Run Code Online (Sandbox Code Playgroud)
现在我尝试对这个类进行大括号初始化.
使用clang,我可以决定是否包含active在初始化列表(MyClass a = { 42, true};)中或不包含(MyClass a = { 42 };).
但是使用gcc,我的代码只有在我不包含的情况下编译active.否则,我将得到以下编译器错误:
error: could not convert ‘{42, true}’ from ‘<brace-enclosed initializer list>’ to ‘MyClass’
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?标准对此有何评价?VSC++怎么样?您推荐哪种方式作为便携式解决方案?
在Debian Linux上使用gcc 4.9和clang 3.5进行测试.
我正在尝试为Blender 2.73创建一个自动构建系统,该系统读取包含大量路径的XML文件,逐个打开文件然后呈现它们.
我正在使用以下代码打开:
bpy.ops.wm.open_mainfile("file_path")
Run Code Online (Sandbox Code Playgroud)
我的问题是我收到以下错误:
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
File "<BLENDER_PATH>/scripts/modules/bpy/ops.py", line 186, in __call__
ret = op_call(self.idname_py(), C_dict, kw, C_exec, C_undo)
TypeError: Calling operator "bpy.ops.wm.open_mainfile" error, expected a string enum in ('INVOKE_DEFAULT', 'INVOKE_REGION_WIN', 'INVOKE_REGION_CHANNELS', 'INVOKE_REGION_PREVIEW', 'INVOKE_AREA', 'INVOKE_SCREEN', 'EXEC_DEFAULT', 'EXEC_REGION_WIN', 'EXEC_REGION_CHANNELS', 'EXEC_REGION_PREVIE)
Run Code Online (Sandbox Code Playgroud) 我有一堆函数,它们都具有相同的名称,但是具有不同的参数(其中一些是模板,有些不是):
void f(int& a) { ... } // there are a few other arithmetic types as well
void f(bool& a) { ... }
template <class T1, class T2> void f(std::pair<T1, T2>&a) { ... }
template <class T> void f(T& a) { ... }
// ...
Run Code Online (Sandbox Code Playgroud)
除此之外,我还有一个枚举:
enum MyEnum {
enumVal1, enumVal2
};
Run Code Online (Sandbox Code Playgroud)
我实际上以为,如果现在调用MyEnum e = enumVal1; f(e);,它将自动调用MyEnum底层类型的重载。没有。而是,它生成一个编译器错误。
现在,我想定义一个模板函数来捕获所有枚举并调用适当的函数。
template <class T, std::enable_if_t<std::is_enum<T>{}> * = nullptr>
void f(T &a) { /* cast to std::underlying_type<T> and call f() …Run Code Online (Sandbox Code Playgroud)