Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对模板参数类型的析构函数的显式调用,即使在对内置函数进行实例化时也是如此 C++程序(有点意外,起初对我)编译并运行良好,除了在主()/结尾处注释的行,如果未注释,则编译时间错误。 #include <typeinfo> #include <iostream> struct Foo { int x; }; template <typename T> void create(char *buffer) { std::cout << "creating " << typeid(T).name() << std::endl; new (buffer) T(); } template <typename T> void destroy(char *buffer) { std::cout << "destroying " << typeid(T).name() << std::endl; ((T*)buffer)->~T(); } int main(int argc, char **argv) { char buffer[sizeof(Foo) > sizeof(bool) ? sizeof(Foo) : sizeof(bool)]; // create/destroy Foo via template function calls create<Foo>(buffer); destroy<Foo>(buffer); // now do the above explicitly... new (buffer) Foo(); ((Foo*)buffer)->~Foo(); // create/destroy bool via template function calls create<bool>(buffer); destroy<bool>(buffer); // now do the above explicitly... new (buffer) bool(); // ((bool*)buffer)->~bool(); // oops, doesn't work return 0; }_C++_Language Lawyer - Fatal编程技术网

对模板参数类型的析构函数的显式调用,即使在对内置函数进行实例化时也是如此 C++程序(有点意外,起初对我)编译并运行良好,除了在主()/结尾处注释的行,如果未注释,则编译时间错误。 #include <typeinfo> #include <iostream> struct Foo { int x; }; template <typename T> void create(char *buffer) { std::cout << "creating " << typeid(T).name() << std::endl; new (buffer) T(); } template <typename T> void destroy(char *buffer) { std::cout << "destroying " << typeid(T).name() << std::endl; ((T*)buffer)->~T(); } int main(int argc, char **argv) { char buffer[sizeof(Foo) > sizeof(bool) ? sizeof(Foo) : sizeof(bool)]; // create/destroy Foo via template function calls create<Foo>(buffer); destroy<Foo>(buffer); // now do the above explicitly... new (buffer) Foo(); ((Foo*)buffer)->~Foo(); // create/destroy bool via template function calls create<bool>(buffer); destroy<bool>(buffer); // now do the above explicitly... new (buffer) bool(); // ((bool*)buffer)->~bool(); // oops, doesn't work return 0; }

对模板参数类型的析构函数的显式调用,即使在对内置函数进行实例化时也是如此 C++程序(有点意外,起初对我)编译并运行良好,除了在主()/结尾处注释的行,如果未注释,则编译时间错误。 #include <typeinfo> #include <iostream> struct Foo { int x; }; template <typename T> void create(char *buffer) { std::cout << "creating " << typeid(T).name() << std::endl; new (buffer) T(); } template <typename T> void destroy(char *buffer) { std::cout << "destroying " << typeid(T).name() << std::endl; ((T*)buffer)->~T(); } int main(int argc, char **argv) { char buffer[sizeof(Foo) > sizeof(bool) ? sizeof(Foo) : sizeof(bool)]; // create/destroy Foo via template function calls create<Foo>(buffer); destroy<Foo>(buffer); // now do the above explicitly... new (buffer) Foo(); ((Foo*)buffer)->~Foo(); // create/destroy bool via template function calls create<bool>(buffer); destroy<bool>(buffer); // now do the above explicitly... new (buffer) bool(); // ((bool*)buffer)->~bool(); // oops, doesn't work return 0; },c++,language-lawyer,C++,Language Lawyer,当T安装在bool上时,编译和运行正常,但对实际的bool执行相同的操作: ((bool*)buffer)->~bool(); 是一个语法错误 我在做模板元编程时发现了这种行为,发现它非常有用,所以我猜它是标准的,是专门为处理类似于我上面提到的情况而添加的。有没有人确切地知道这是否真的是这样,以及这种行为何时被标准化了 此外,有人能指出标准中允许这种情况的确切措辞是什么,以及它允许的情况的范围吗?(我不擅长阅读标准化,所以我自己很难理解这个问题) < P>这确实是有效的C++(并且从C+

当T安装在
bool
上时,编译和运行正常,但对实际的
bool
执行相同的操作:

((bool*)buffer)->~bool();
是一个语法错误

我在做模板元编程时发现了这种行为,发现它非常有用,所以我猜它是标准的,是专门为处理类似于我上面提到的情况而添加的。有没有人确切地知道这是否真的是这样,以及这种行为何时被标准化了

此外,有人能指出标准中允许这种情况的确切措辞是什么,以及它允许的情况的范围吗?(我不擅长阅读标准化,所以我自己很难理解这个问题)

< P>这确实是有效的C++(并且从C++ 98开始,据我所知),并被称为伪析构函数调用。N4431§5.2.4[解释伪]:

1在点
或箭头
->
后使用伪析构函数名称 运算符表示由表示的非类类型的析构函数 类型名称或decltype说明符。结果只能用作函数调用运算符
()
的操作数,并且 此类调用的类型为
void
。唯一的影响是对 点或箭头前的后缀表达式

2点运算符的左侧应为标量类型。这个 箭头运算符的左侧应为指向标量的指针 类型。此标量类型是对象类型。简历不合格的版本 对象类型和 伪析构函数名称应为相同类型。此外,这两个类型的名称在一个伪析构函数的形式名称

nested-name-specifier_opt type-name :: ~ type-name
应指定相同的标量类型

伪析构函数名称是(§5.2[expr.post])中的一个:

而类型名称是(§7.1.6.2[dcl.type.simple])


bool
不是类型名,因此
~bool()
版本是语法错误。在模板内部,模板类型参数是一个类型定义名称(§14.1[temp.param]/p3),它是一个类型名称,因此编译
~T()
版本。

这类似于问题。但是我不确定它是否是一个完全相同的副本。@martin我特别询问的是模板在内置类型上实例化的情况,我认为这个问题实际上没有涉及到……在Visual Studio中编译时,我得到了“错误C2059:语法错误:‘我有一个问题,如果按照上面的标准,如果它是有效的C++,那么为什么它不编译?”谢谢。只是好奇,StasarDEE认为“代码> BoOL <代码>是什么,如果不是一个类型名?@ TrutoRange< Cult> Boo.<代码>是一个简单的类型说明符。“TrutoReand相反,类型名称是简单类型说明符的子集:”@马丁(假设你是标量类型)我猜想是故意的;让人们编写完全无用的代码毫无意义。
nested-name-specifier_opt type-name :: ~ type-name
nested-name-specifier_opt type-name :: ~ type-name
nested-name-specifier template simple-template-id :: ~ type-name
~ type-name
~ decltype-specifier
class-name
enum-name
typedef-name
simple-template-id