test.cpp
enum {
ERR_FILE_ACCESS = 1,
ERR_WHATEVER
};
enum ERR : unsigned int {
ERR_FILE_ACCESS = 5,
ERR_FILE_FORMAT = 6
};
int main(int, char**)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,重新定义枚举器“ERR_FILE_ACCESS”会失败。但:
test2.cpp
enum {
ERR_FILE_ACCESS = 1,
ERR_FILE_FORMAT,
ERR_WHATEVER
};
namespace Internal {
enum ERR : unsigned int {
ERR_FILE_ACCESS = 5,
ERR_FILE_FORMAT = 6
};
}
using namespace Internal;
int main(int, char**)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
确实编译成功。
我很惊讶/困惑,为什么命名空间 - after using namespace Internal;- 可以防止名称冲突?
class A {
public:
A(void) =default;
A& foo(void)
{
return *this;
}
};
int main(int, char**)
{
A a =A{}.foo();
A b{};
A c{}.foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C:\temp\cpp>clang test.cpp
test.cpp:15:8: error: expected ';' at end of declaration
15 | A c{}.foo();
| ^
| ;
1 error generated.
Run Code Online (Sandbox Code Playgroud)
为什么编译器会抱怨A c{}.foo()?
有没有办法避免分配?
我知道在 中A a =A{}.foo(),编译器会优化掉临时的,但可能A没有公共复制因子。
c++ ×2