相关疑难解决方法(0)

什么是"表达SFINAE"?

http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx上,VC++团队正式声明他们尚未实现C++ 11核心功能"Expression SFINAE".但是,从http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html复制的以下代码示例将被VC++编译器接受.

例1:

template <int I> struct A {};

char xxx(int);
char xxx(float);

template <class T> A<sizeof(xxx((T)0))> f(T){}

int main()
{
    f(1);
}
Run Code Online (Sandbox Code Playgroud)

例2:

struct X {};
struct Y 
{
    Y(X){}
};

template <class T> auto f(T t1, T t2) -> decltype(t1 + t2); // #1
X f(Y, Y);  // #2

X x1, x2;
X x3 = f(x1, x2);  // deduction fails on #1 (cannot add X+X), calls #2
Run Code Online (Sandbox Code Playgroud)

我的问题是:什么是"表达SFINAE"?

c++ templates sfinae visual-c++ c++11

56
推荐指数
1
解决办法
1万
查看次数

引用类型和odr使用的模板非类型参数

v下面的示例代码中的变量是否使用了odr

extern void* v;

template<void*&>
void f() {}

int main()
{
    f<v>();
}
Run Code Online (Sandbox Code Playgroud)

我在Boost ML中发现了这种模式.

比照 http://lists.boost.org/Archives/boost/2011/04/180082.php

它表示boost::enabler永远不会定义,但如果提供选项,clang会将其拒绝为链接错误-g.

比照 http://melpon.org/wandbox/permlink/nF45k7un3rFb175z

上面的示例代码是Boost ML代码的缩减版本,clang也拒绝它.

比照 http://melpon.org/wandbox/permlink/ZwxaygXgUhbi1Cbr

我认为(但我不确定)参考类型的模板非类型参数是odr使用的,即使它们未在模板体中引用,因此Boost ML的模式是错误的.

我的理解是否正确?

c++ boost language-lawyer

14
推荐指数
2
解决办法
174
查看次数

标签 统计

c++ ×2

boost ×1

c++11 ×1

language-lawyer ×1

sfinae ×1

templates ×1

visual-c++ ×1