这是代码:
struct foo {
template<typename T = void>
friend foo f() { return {}; }
};
int main() {
auto x = f(); // clang++ can't find it, g++ can.
}
Run Code Online (Sandbox Code Playgroud)
clang ++ 3.4给出:
fni2.cpp:8:12: error: use of undeclared identifier 'f'
auto x = f(); // clang++ can't find it, g++ can.
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
g ++ 4.9.0编译它,但我不认为它应该有.这是一个相关的问题,但没有明确的答案.第15.4.2/2,4节讨论了这一点,但他们都没有说任何暗示在类中定义的友元函数模板应该与类中定义的非模板友元函数具有不同的可见性.
这只是我的学术兴趣,虽然它确实来自其他可能有实际用例的人提出的问题.
它看起来像是一个g ++错误.
因此,当没有参数(via )传递时,显然将std::nullptr_t参数转换为类型的空指针void *(N3337的第5.2.2/7节...).这意味着要正确传递空char *指针,例如,仍然需要强制转换:
some_variadic_function("a","b","c",(const char*)std :: nullptr);
因为不能保证null void *具有与null 相同的位模式char *.正确?
这也意味着,没有任何优势,以std::nullptr过度0在这种情况下,除非是清晰.
对于以下代码:
template <typename... Ts>
struct Set {};
template <typename T, typename... Ts>
using Tail = Set<Ts...>;
template <typename T, typename TS>
struct MemberOf;
template <typename T, typename... Ts>
struct MemberOf<T, Set<T, Ts...>> {
static constexpr bool value = true;
};
template <typename T>
struct MemberOf<T, Set<>> {
static constexpr bool value = false;
};
template <typename T, typename... Ts>
struct MemberOf<T, Set<Ts...>> {
static constexpr bool value = false || MemberOf<T, Tail<Ts...>>::value;
};
Run Code Online (Sandbox Code Playgroud)
g ++ 4.9.0给出:
ts.cpp:27:63: error: pack expansion …Run Code Online (Sandbox Code Playgroud) 我注意到使用-r部分链接实际上并没有解决任何重定位问题,即使它们可以通过相对寻址解决。例如,考虑f.o并g.o与f.o含f()这就要求g()内g.o。在链接之前,拆卸和重定位按预期进行。然而,在部分链接到一个新文件h.o(通过ld -r -o h.o f.o g.o)之后,仍然存在对调用的重定位g(),即使理论上它可以用相对地址解析。
这是h.o( objdump -d h.o)的反汇编,包含f()和g()。您可以看到对 的调用g()仍未解决:
h.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <f>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: e8 00 00 00 00 callq 9 <f+0x9>
9: 90 nop
a: 5d pop %rbp
b: c3 retq
000000000000000c …Run Code Online (Sandbox Code Playgroud)