Calling methods of temporary objects created using class template argument deduction [duplicate]
up vote
7
down vote
favorite
This question already has an answer here:
Template Argument Deduction Broken in Clang 6 for Temporary Objects
1 answer
I have the following piece of C++17 code that uses class template deduction:
template <typename T>
struct Test {
T t;
Test(T t) : t(t) {}
bool check() { return true; }
};
template <typename T>
bool check(T t) {
return Test(t).check();
}
int main() {
return check(1);
}
gcc 8.2 compiles this without any problems, while clang 7.0 complains:
test.cpp:10:16: error: member reference base type 'Test' is not a structure or union
return Test(t).check();
~~~~~~~^~~~~~
I do not yet have a complete grasp of the intricacies of the class template argument deduction mechanism. Is this a bug in clang or am I using CTAD in a wrong way?
c++ gcc clang language-lawyer c++17
marked as duplicate by Jans, Matthieu Brucher, πάντα ῥεῖ
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 22 at 17:19
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
up vote
7
down vote
favorite
This question already has an answer here:
Template Argument Deduction Broken in Clang 6 for Temporary Objects
1 answer
I have the following piece of C++17 code that uses class template deduction:
template <typename T>
struct Test {
T t;
Test(T t) : t(t) {}
bool check() { return true; }
};
template <typename T>
bool check(T t) {
return Test(t).check();
}
int main() {
return check(1);
}
gcc 8.2 compiles this without any problems, while clang 7.0 complains:
test.cpp:10:16: error: member reference base type 'Test' is not a structure or union
return Test(t).check();
~~~~~~~^~~~~~
I do not yet have a complete grasp of the intricacies of the class template argument deduction mechanism. Is this a bug in clang or am I using CTAD in a wrong way?
c++ gcc clang language-lawyer c++17
marked as duplicate by Jans, Matthieu Brucher, πάντα ῥεῖ
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 22 at 17:19
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
1
I can confirm the error, withclang++ -std=c++17
.
– lubgr
Nov 22 at 17:03
2
Works on latest GCC and MSVC (with c++17 switch), so I assume this is a clang issue. Don't forget to create a bug report.
– Dan M.
Nov 22 at 17:05
1
Yes the issue is clang: godbolt.org/z/bg5cuN
– Oliv
Nov 22 at 17:05
How can this be a duplicate of a question about a bug that has already been resolved in clang? This seems to be a different bug.
– Nikola Benes
Nov 22 at 18:10
1
The bug report: llvm.org/pr39663
– Rakete1111
Nov 23 at 6:19
add a comment |
up vote
7
down vote
favorite
up vote
7
down vote
favorite
This question already has an answer here:
Template Argument Deduction Broken in Clang 6 for Temporary Objects
1 answer
I have the following piece of C++17 code that uses class template deduction:
template <typename T>
struct Test {
T t;
Test(T t) : t(t) {}
bool check() { return true; }
};
template <typename T>
bool check(T t) {
return Test(t).check();
}
int main() {
return check(1);
}
gcc 8.2 compiles this without any problems, while clang 7.0 complains:
test.cpp:10:16: error: member reference base type 'Test' is not a structure or union
return Test(t).check();
~~~~~~~^~~~~~
I do not yet have a complete grasp of the intricacies of the class template argument deduction mechanism. Is this a bug in clang or am I using CTAD in a wrong way?
c++ gcc clang language-lawyer c++17
This question already has an answer here:
Template Argument Deduction Broken in Clang 6 for Temporary Objects
1 answer
I have the following piece of C++17 code that uses class template deduction:
template <typename T>
struct Test {
T t;
Test(T t) : t(t) {}
bool check() { return true; }
};
template <typename T>
bool check(T t) {
return Test(t).check();
}
int main() {
return check(1);
}
gcc 8.2 compiles this without any problems, while clang 7.0 complains:
test.cpp:10:16: error: member reference base type 'Test' is not a structure or union
return Test(t).check();
~~~~~~~^~~~~~
I do not yet have a complete grasp of the intricacies of the class template argument deduction mechanism. Is this a bug in clang or am I using CTAD in a wrong way?
This question already has an answer here:
Template Argument Deduction Broken in Clang 6 for Temporary Objects
1 answer
c++ gcc clang language-lawyer c++17
c++ gcc clang language-lawyer c++17
edited Nov 22 at 17:01
Nicol Bolas
280k33461634
280k33461634
asked Nov 22 at 16:59
Nikola Benes
9281822
9281822
marked as duplicate by Jans, Matthieu Brucher, πάντα ῥεῖ
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 22 at 17:19
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Jans, Matthieu Brucher, πάντα ῥεῖ
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 22 at 17:19
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
1
I can confirm the error, withclang++ -std=c++17
.
– lubgr
Nov 22 at 17:03
2
Works on latest GCC and MSVC (with c++17 switch), so I assume this is a clang issue. Don't forget to create a bug report.
– Dan M.
Nov 22 at 17:05
1
Yes the issue is clang: godbolt.org/z/bg5cuN
– Oliv
Nov 22 at 17:05
How can this be a duplicate of a question about a bug that has already been resolved in clang? This seems to be a different bug.
– Nikola Benes
Nov 22 at 18:10
1
The bug report: llvm.org/pr39663
– Rakete1111
Nov 23 at 6:19
add a comment |
1
I can confirm the error, withclang++ -std=c++17
.
– lubgr
Nov 22 at 17:03
2
Works on latest GCC and MSVC (with c++17 switch), so I assume this is a clang issue. Don't forget to create a bug report.
– Dan M.
Nov 22 at 17:05
1
Yes the issue is clang: godbolt.org/z/bg5cuN
– Oliv
Nov 22 at 17:05
How can this be a duplicate of a question about a bug that has already been resolved in clang? This seems to be a different bug.
– Nikola Benes
Nov 22 at 18:10
1
The bug report: llvm.org/pr39663
– Rakete1111
Nov 23 at 6:19
1
1
I can confirm the error, with
clang++ -std=c++17
.– lubgr
Nov 22 at 17:03
I can confirm the error, with
clang++ -std=c++17
.– lubgr
Nov 22 at 17:03
2
2
Works on latest GCC and MSVC (with c++17 switch), so I assume this is a clang issue. Don't forget to create a bug report.
– Dan M.
Nov 22 at 17:05
Works on latest GCC and MSVC (with c++17 switch), so I assume this is a clang issue. Don't forget to create a bug report.
– Dan M.
Nov 22 at 17:05
1
1
Yes the issue is clang: godbolt.org/z/bg5cuN
– Oliv
Nov 22 at 17:05
Yes the issue is clang: godbolt.org/z/bg5cuN
– Oliv
Nov 22 at 17:05
How can this be a duplicate of a question about a bug that has already been resolved in clang? This seems to be a different bug.
– Nikola Benes
Nov 22 at 18:10
How can this be a duplicate of a question about a bug that has already been resolved in clang? This seems to be a different bug.
– Nikola Benes
Nov 22 at 18:10
1
1
The bug report: llvm.org/pr39663
– Rakete1111
Nov 23 at 6:19
The bug report: llvm.org/pr39663
– Rakete1111
Nov 23 at 6:19
add a comment |
1 Answer
1
active
oldest
votes
up vote
4
down vote
This is a clang bug [expr.type.conv]/1:
If the type is a placeholder for a deduced class type, it is replaced by the return type of the function selected by overload resolution for class template deduction for the remainder of this subclause.
So template deduction also applies in functional conversion expression.
You can circumvent this clang bug this way:
template <typename T>
bool check(T t) {
auto x=Test(t);
return x.check();
}
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
This is a clang bug [expr.type.conv]/1:
If the type is a placeholder for a deduced class type, it is replaced by the return type of the function selected by overload resolution for class template deduction for the remainder of this subclause.
So template deduction also applies in functional conversion expression.
You can circumvent this clang bug this way:
template <typename T>
bool check(T t) {
auto x=Test(t);
return x.check();
}
add a comment |
up vote
4
down vote
This is a clang bug [expr.type.conv]/1:
If the type is a placeholder for a deduced class type, it is replaced by the return type of the function selected by overload resolution for class template deduction for the remainder of this subclause.
So template deduction also applies in functional conversion expression.
You can circumvent this clang bug this way:
template <typename T>
bool check(T t) {
auto x=Test(t);
return x.check();
}
add a comment |
up vote
4
down vote
up vote
4
down vote
This is a clang bug [expr.type.conv]/1:
If the type is a placeholder for a deduced class type, it is replaced by the return type of the function selected by overload resolution for class template deduction for the remainder of this subclause.
So template deduction also applies in functional conversion expression.
You can circumvent this clang bug this way:
template <typename T>
bool check(T t) {
auto x=Test(t);
return x.check();
}
This is a clang bug [expr.type.conv]/1:
If the type is a placeholder for a deduced class type, it is replaced by the return type of the function selected by overload resolution for class template deduction for the remainder of this subclause.
So template deduction also applies in functional conversion expression.
You can circumvent this clang bug this way:
template <typename T>
bool check(T t) {
auto x=Test(t);
return x.check();
}
answered Nov 22 at 17:12
Oliv
8,0551854
8,0551854
add a comment |
add a comment |
1
I can confirm the error, with
clang++ -std=c++17
.– lubgr
Nov 22 at 17:03
2
Works on latest GCC and MSVC (with c++17 switch), so I assume this is a clang issue. Don't forget to create a bug report.
– Dan M.
Nov 22 at 17:05
1
Yes the issue is clang: godbolt.org/z/bg5cuN
– Oliv
Nov 22 at 17:05
How can this be a duplicate of a question about a bug that has already been resolved in clang? This seems to be a different bug.
– Nikola Benes
Nov 22 at 18:10
1
The bug report: llvm.org/pr39663
– Rakete1111
Nov 23 at 6:19