- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑下面的类模板,它包含同一个 friend (相同的函数类型;见下文)的两个(隐藏) friend 声明,它也定义了 friend (因此 friend 是内联的),但定义条件为(互斥) 要求条款:
#include <iostream>
struct Base {};
template<int N>
struct S : public Base {
friend int foo(Base&) requires (N == 1) { return 1; }
friend int foo(Base&) requires (N == 2) { return 3; }
};
[dcl.fct]/8声明尾部的 requires 子句不是函数类型的一部分 [
重点 矿]:
The return type, the parameter-type-list, the ref-qualifier, the cv-qualifier-seq, and the exception specification, but not the default arguments ([dcl.fct.default]) or the trailing requires-clause ([dcl.decl]), are part of the function type.
No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, template, default argument for a parameter (for a function in a given scope), or default template argument.
// ... as above
// (A)
int main() {
S<1> s1{};
std::cout << foo(s1); // Clang & GCC: 1
}
然而,对于下面的程序 (B) 到 (D),Clang 接受它们,而 GCC 拒绝它们,并出现重新定义错误:
// (B)
int main() {
S<1> s1{};
S<2> s2{}; // GCC: re-definition error of 'foo'
}
// (C)
int main() {
S<1> s1{};
S<2> s2{}; // GCC: re-definition error of 'foo'
std::cout << foo(s1); // Clang: 1
}
// (D)
template struct S<1>;
template struct S<2>; // GCC: re-definition error of 'foo'
int main() {}
只有当实际尝试通过 ADL 在两个特化上调用 friend 函数时,Clang 才会实际发出错误
// (E)
int main() {
S<1> s1{};
S<2> s2{}; // GCC: re-definition error of 'foo'
std::cout << foo(s1); // MSVC: ambiguous call
std::cout << foo(s2);
// Clang error: definition with same mangled name
// '_Z3fooR4Base' as another definition
}
并且我们可能会注意到,只有 MSVC 实际上达到了看似接受这两个定义的状态,然后它按预期失败(“模棱两可的调用”)。
最佳答案
来自 over#dcl-1 ,
Two function declarations of the same name refer to the same function if they are in the same scope and have equivalent parameter declarations ([over.load]) and equivalent ([temp.over.link]) trailing requires-clauses, if any ([dcl.decl]).
[Note 1: Since a constraint-expression is an unevaluated operand, equivalence compares the expressions without evaluating them.
[Example 1:template<int I> concept C = true;
template<typename T> struct A {
void f() requires C<42>; // #1
void f() requires true; // OK, different functions
};
— end example]
— end note]
foo
(因此不会违反 ODR),因为需要不同的条款。
关于c++ - 仅在(互斥)requires-clauses : legal or an ODR-violation? 中通过差异重载隐藏的 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64758699/
考虑这个程序: #include template constexpr bool g() { return true; } template std::enable_if_t()> f() {}
我尝试编写一种简单的方法来在程序开始时自动执行代码(不使用不可移植的属性())。 我编写了以下代码,如果将 main() 之前编写的代码放在头文件中,我会问它是否确实违反了 ODR。 或者,内联函数和
如果编译的话,像这样的东西会明显违反 C++ 的单一定义规则: // Case 1 // something.h struct S {}; struct A { static const S v
想象一下我有两个不同的翻译单元 a.cpp #include double bar(); template T foobar(T t) { return t; } int main() {
似乎无法让简单的堆栈实现正常工作。我只是想让两个不同的类(B 类和 C 类)能够在由第三类(A 类)管理的相同堆栈中推送和打印元素。 A.cpp #include "A.h" void A::pop(
我确实理解 ODR 所说的内容,但我不理解它试图实现的目标。 我看到违反它的两个后果——用户会得到语法错误,这完全没问题。并且还可能存在一些 fatal error ,并且用户将再次成为唯一有罪的人。
当今的许多 C++ 代码都倾向于在最大程度上进行模板加载。它们是库:STL、Boost.Spirit、Boost.MPL 等。他们鼓励用户在表单中声明功能对象 struct S { /* presen
链接包含不同版本 boost 的静态 cpp 库和动态 cpp 库是否会违反 ODR? 我正在开发一个 iPhone 应用程序。对于最终的可执行文件,我需要链接一个静态库,比如 libstatic1.
详细解释如下,问题在底部。 我的问题具体指的是当前的 C++ 标准草案(也是当前的“主要”标准)here .更具体地说,关于成员函数和 ODR,第 3.2 节第 6 点(第 35 页)指出 D 的每个
问题是关于 C++ 文档和标准文档的。以下代码中是否使用了变量 x odr? extern int x; template T f() { return x; } 我好像没用过,老兄文档里有写吗? (
在从生产库在线阅读代码时,我发现了类似这样的东西 Traits.hpp template class Traits { template * = nullptr> static vo
来自 here : struct piecewise_construct_t {}; constexpr piecewise_construct_t piecewise_construct = {};
我对 static 有点困惑const 的类内初始化成员。例如,在下面的代码中: #include struct Foo { const static int n = 42; }; // c
这个问题出现在 this answer 的背景下. 如我所料,这个翻译单元无法编译: template int getNum() { return Num; } template int getNu
在同时使用 C 和 C++ 的项目中,.h 文件包含类型的定义。如果该定义取决于 header 是否包含在 c 或 cpp 文件中,我是否违反了单一定义规则? // my_header.h struc
Stack Overflow 上有几个问题,类似于“为什么我不能在 C++ 中初始化静态数据成员”。大多数答案都引用标准告诉你什么你可以做什么;那些试图回答为什么的人通常指向一个链接(现在似乎不可用)
考虑以下说明性示例 #include template struct Base { static int const touch; Base() { (void)t
我正在尝试使用非球面透镜公式将 9 个点的云拟合为圆锥曲线: z(r) = r² /(R*(1+sqrt(1-(1+K)*(r²/R²)))) 其中 R 是曲率半径,K 是圆锥常数,r = sqrt(
我们有一个头文件,其中包含各种浮点精度的一些残差: template struct rsdTarget { static const double value; }; template <> c
这个问题在这里已经有了答案: If I don't odr-use a variable, can I have multiple definitions of it across translat
我是一名优秀的程序员,十分优秀!