如果我有一个模板类:
template<typename Layout>
class LayoutHandler : Handler {
};
Run Code Online (Sandbox Code Playgroud)
我想将参数Layout公开给该类的用户.然后:
template<typename Layout>
class LayoutHandler : Handler {
public:
typedef Layout Layout; // using the same name
};
Run Code Online (Sandbox Code Playgroud)
VS2012可以编译此代码,并给出预期的结果.(我使用std :: is_same来检查它.)在标准C++ 03或C++ 11中是否允许这样做?
我正在阅读增强文档,并在http://www.boost.org/doc/libs/1_54_0/doc/html/lambda/le_in_details.html上查看以下内容:
无法重载的运算符
有些运算符根本不能重载(::,.,.*).对于某些运算符,对返回类型的要求会阻止它们重载以创建lambda仿函数.这些运算符是 - >., - >,new,new [],delete,delete []和?:(条件运算符).
那么运营商是->.什么?我尝试了谷歌和http://www.symbolhound.com/,但没有得到任何有用的东西,在N3337上搜索得到1 ->个句子结尾的结果,并且Visual Studio 2012将无法编译:
class xT {
bool operator ->. () {} /* fail */
};
std::string* p;
p->.size(); /* fail */
std::auto_ptr<std::string> a;
a->.size(); /* fail */
Run Code Online (Sandbox Code Playgroud)
我相信,笔者特意写了->.,因为->和.也包括在内,但什么是->.,为什么它是在这里?
int func() {
int a;
++a; // is this safe?
printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)
我知道什么时候我a得到了未定义的行为,但++a在C++标准中是否安全?这会将"另一个"未初始化的值分配给a没有副作用(抛出异常或导致程序崩溃)吗?
我只能想到使用 std::exception::what() 的以下情况:
\n\n输出它,例如MessageBox(e.what())或cout << e.what()。据我所知,这些消息对许多用户来说毫无用处。例如,当我尝试重命名一个不存在的文件时:
\n\n\n\n
boost::filesystem::rename: \xe7\xb3\xbb\xe7\xbb\x9f\xe6\x89\xbe\xe4\xb8\x8d\xe5\x88\xb0\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe6\x96\x87\xe4\xbb\xb6\xe3\x80\x82: "D:\\MyDesktop\\4", "D:\\MyDesktop\\5"
(中文意思是“系统找不到指定的文件。”)用户如何解密这些混合的东西?另外,它是一个const char*而不是类似 的东西const platform_char*,在 Windows 中可能存在 unicode 问题。
std::regex_match(e.what()...)。我认为这是一个糟糕的想法,显示出设计缺陷。那么我应该在哪里使用 std::exception::what() ?是不是没用?
\n