C ++中定义上下文和实例化点之间非依赖性构造的解释差异

stackcpp

N4527 14.6 [温度] / p8

如果由于不依赖模板参数的构造而导致模板定义后的假想实例化不正确,则程序不正确;无需诊断。如果在假设的实例中这种构造的解释与在模板的任何实际实例中对相应构造的解释不同,则程序格式错误;无需诊断。[注意:在以下情况下可能会发生这种情况:

(8.1)—在非依赖名称中使用的类型在定义模板时是不完整的,但在执行实例化时是完整的,或

(8.2)—实例化使用在定义模板时尚未定义的默认参数或默认模板参数,或

(8.3)-模板实例化中的常量表达式求值(5.20)

(8.3.1)—整数或无范围枚举类型的const对象的值,或者

(8.3.2)— constexpr对象的值,或者

(8.3.3)-参考值或

(8.3.4)-constexpr函数的定义,

并且在定义模板时未定义该实体,或者

那么,这些代码格式不正确吗?

代码1:

extern double b;

template<class T>
void f(T=b){}

void g(){
    f<double>();//ill-formed or not?
}

double b = 0;

void h(){
    f<double>();//ill-formed or not?
}

代码2:

//translation 1
extern double b;

template<class T>
void f(T=b){}

void g(){
    f<double>();//ill-formed or not?
}

//translation 2
double b = 0;

Issue1850定义上下文和实例化点之间的区别

模板中的非依赖引用所引用的实体的各种特征可以在定义上下文和该模板的专门化实例化点之间改变其中包括初始化(影响对象是否可以在常量表达式中使用),函数和模板默认参数以及类型的完整性。关于在定义上下文中还是在实例化时检查这些内容,存在实现上的分歧。如果在两个上下文之间这种引用的有效性发生变化,则可能需要一个规则来使其格式错误,而无需诊断。

您能否向我展示更多有关两个上下文之间非依赖名称的特征有何不同的示例?通常约为8.2和8.3.1

TC

这是一个例子:

extern const int b;

template<int, int>
void f(int);

template<int, const int &>
void f(long);

template<class>
void g() {
    f<0, b>(0);
}
// #1

extern const int b = 0;


int main(){
    g<int>(); 
}

// #2

在#1处的假设实例化将调用void f<0, b>(long),因为此时b不是常量表达式,所以(int)重载SFINAE消失了。#2处的实例化(这是的实例化点g<int>)将调用void f<0, 0>(int),因为到那时b是一个常量表达式,(int)重载是可行的,并且可以赢得重载解决方案。

Clang和GCC实际上将f使用此代码调用不同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#中WinForms Apps和Windows Service上下文之间的一致ApplicationData路径

来自分类Dev

如何将上下文传递给C / C ++中定义的Ruby方法

来自分类Dev

Opentracing和W3C跟踪上下文之间的区别(关于标头)

来自分类Dev

如何在C#中定义NDepend API CQLinq执行上下文?

来自分类Dev

以编程方式自定义 C# WPF 中的上下文菜单项

来自分类Dev

C ++定义和实例化之间有什么区别?

来自分类Dev

C ++上下文错误

来自分类Dev

在C ++中{}和{0}之间的括号初始化差异

来自分类Dev

Gvim没有显示在.c和.h文件的nautilus上下文菜单中

来自分类Dev

C ++内联函数和特定于上下文的优化

来自分类Dev

C ++内联函数和特定于上下文的优化

来自分类Dev

显示C代码中全局变量的依赖性

来自分类Dev

在静态方法中实例化非静态类(上下文),构造函数以对象类型为参数

来自分类Dev

静态上下文在C#中是否总是单个?

来自分类Dev

什么是C ++中未评估的上下文?

来自分类Dev

C,C ++和Java中的吊装/重新排序:变量声明必须始终在上下文中位于顶部吗?

来自分类Dev

C ++ STL的系统级别依赖性

来自分类Dev

C ++ STL的系统级别依赖性

来自分类Dev

非定义名称的重载解析何时在定义上下文或实例化点发生?

来自分类Dev

OpenCL-C ++包装器-动态库中的上下文取消初始化会导致访问冲突

来自分类Dev

C ++基于上下文的类实现

来自分类Dev

如何获取C ++异常的上下文?

来自分类Dev

C# 上下文错误

来自分类Dev

C ++-在嵌套模板实例化中调用非默认构造函数

来自分类Dev

在C ++ 03的未定义上下文中使用表示非静态数据成员的id表达式是否有效?

来自分类Dev

C# 和 SharePoint 2013 - 了解上下文和列表

来自分类Dev

在Windows上,bin目录和cmd目录之间的区别(在“ C:\ Program Files \ git \ cmd | bin \ git.exe的上下文中

来自分类Dev

QML报告ReferenceError:未在添加到上下文的C ++对象上定义XYZ

来自分类Dev

QML报告ReferenceError:未在添加到上下文的C ++对象上定义XYZ

Related 相关文章

  1. 1

    C#中WinForms Apps和Windows Service上下文之间的一致ApplicationData路径

  2. 2

    如何将上下文传递给C / C ++中定义的Ruby方法

  3. 3

    Opentracing和W3C跟踪上下文之间的区别(关于标头)

  4. 4

    如何在C#中定义NDepend API CQLinq执行上下文?

  5. 5

    以编程方式自定义 C# WPF 中的上下文菜单项

  6. 6

    C ++定义和实例化之间有什么区别?

  7. 7

    C ++上下文错误

  8. 8

    在C ++中{}和{0}之间的括号初始化差异

  9. 9

    Gvim没有显示在.c和.h文件的nautilus上下文菜单中

  10. 10

    C ++内联函数和特定于上下文的优化

  11. 11

    C ++内联函数和特定于上下文的优化

  12. 12

    显示C代码中全局变量的依赖性

  13. 13

    在静态方法中实例化非静态类(上下文),构造函数以对象类型为参数

  14. 14

    静态上下文在C#中是否总是单个?

  15. 15

    什么是C ++中未评估的上下文?

  16. 16

    C,C ++和Java中的吊装/重新排序:变量声明必须始终在上下文中位于顶部吗?

  17. 17

    C ++ STL的系统级别依赖性

  18. 18

    C ++ STL的系统级别依赖性

  19. 19

    非定义名称的重载解析何时在定义上下文或实例化点发生?

  20. 20

    OpenCL-C ++包装器-动态库中的上下文取消初始化会导致访问冲突

  21. 21

    C ++基于上下文的类实现

  22. 22

    如何获取C ++异常的上下文?

  23. 23

    C# 上下文错误

  24. 24

    C ++-在嵌套模板实例化中调用非默认构造函数

  25. 25

    在C ++ 03的未定义上下文中使用表示非静态数据成员的id表达式是否有效?

  26. 26

    C# 和 SharePoint 2013 - 了解上下文和列表

  27. 27

    在Windows上,bin目录和cmd目录之间的区别(在“ C:\ Program Files \ git \ cmd | bin \ git.exe的上下文中

  28. 28

    QML报告ReferenceError:未在添加到上下文的C ++对象上定义XYZ

  29. 29

    QML报告ReferenceError:未在添加到上下文的C ++对象上定义XYZ

热门标签

归档