[cfe-dev] Functional style casts in exception specification
Stephen Kelly
steveire at gmail.com
Mon Jan 21 17:53:38 PST 2013
Hi there,
While attempting to implement a feature, I hit
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56071 in g++, though that seems
to work with clang, and I hit other bugs in clang, which work with g++.
With this code:
class B
{
template <typename T> friend struct A;
private:
B(int, char) {}
~B() {}
};
template <typename T>
struct A
{
T t;
template<typename... Args>
A(Args&&... args) noexcept(noexcept(T(std::forward<Args>(args)...)))
: t(std::forward<Args>(args)...)
{}
};
struct C {
A<B> delegate;
template<typename... Args>
C(Args&&... args)
noexcept(noexcept(A<B>(std::forward<Args>(args)...)))
: delegate(std::forward<Args>(args)...)
{ }
};
#endif
int main() {
A<B> ab(42, 'f'); // Works
C c(42, 'f'); // Fails
return 0;
}
I get this error with clang:
other.cpp:59:41: error: no matching conversion for functional-style cast
from 'const A<B>' to 'B'
A(Args&&... args) noexcept(noexcept(T(std::forward<Args>(args)...)))
If I try using uniform-initialization instead, I get this:
other.cpp:59:41: error: 'T' does not refer to a value
A(Args&&... args) noexcept(noexcept(T{std::forward<Args>(args)...}))
Though that works fine in g++. Are these bugs in clang that I should file?
One bug report or two?
Any ideas of a workaround?
Thanks,
Steve.
More information about the cfe-dev
mailing list